2016-02-12 51 views
2

我想捕获一些字符串,只有当它出现,所以我使用?捕获后()意思是我想捕获那部分字符串,但它不必显示(零或一)但是当我()之后添加?拖放那场比赛:括号后面的javascript正则表达式问号

var str = 'blablablacaptureblablabla'; 

,如果我做一个普通捕获与()我得到的欲望捕获:

console.log(str.match(/.*(capture).*/i)); // array[1] = capture 

如果我添加?来表示捕获可能是或不是我所能得到的undefined:

console.log(str.match(/.*(capture)?.*/i)); // array[1] = undefined 

这是为什么?所有我想要的是捕获字capture是否其存在与否的字符串因此这将不会返回null:

var str = 'blablablalablabla'; //string without word 'capture' 
console.log(str.match(/.*(capture)?.*/i)); // this will work but if i use it with string with the word 'capture' it won't capture the 'capture' 

编辑:

只要是明确的 - 我想这个字符串blablacaptureblabla到捕捉字capture,也该字符串blablablabla不返回null,因为我使用?这意味着零或一个

+0

你的意思'的console.log ;'?因此,如果输入中不存在“capture”,组1总是使用空字符串进行初始化? –

+0

如果你移动捕获组圆括号内的'?',它会起作用:'console.log(str.match(/.*(capture?)。*/i));' –

+0

@StephenP - 但是如果我用它字符串没有捕获像'blablablalablabla'这样的字,它会在匹配时返回'null' - 这不是我想要的,因为我想要零或一个('?') – Adidi

回答

3

如果你想捕获值总是被初始化(以避免捕获组#undefined值1),你需要使用一个强制性组与空交替使用回火贪婪令牌(?:(?!capture).)*

/^(?:(?!capture).)*(capture|).*/i 

regex demo

一个tempered greedy token是一个由(非)捕获组((?:...)(...))组成的特殊构造,它与未应用特定序列的单个字符匹配(使用负向预览,(?!...)),应用量化符。

下面是一个JS演示:(str.match(/.*(捕获|)*/I)[1])

var str = 'blablablalablabla'; //string without word 'capture' 
 
document.body.innerHTML = '"' + str.match(/^(?:(?!capture).)*(capture)?.*/i)[1] + '"<br/>'; // undefined, as the group is optional 
 
document.body.innerHTML += '"' + str.match(/^(?:(?!capture).)*(capture|).*/i)[1] + '"<br/>'; // empty string, the group is obligatory 
 
var str1 = 'blablabcapturelalablabla'; 
 
document.body.innerHTML += '"' + str1.match(/^(?:(?!capture).)*(capture|).*/i)[1] + '"';

+0

但是,如果我使用字符串:'var str ='blablabcapturelalablabla';'用'capture'这个词它仍然会返回空匹配!如果有捕获,我想要匹配捕获 – Adidi

+0

嘿嘿:))))))))) – Adidi

+0

我更新了答案 - 问题是即使使用懒惰点匹配,空替换也会获胜。我建议使用温和的贪婪标记来“锻炼”贪婪的量词,并且只匹配与“捕获”不匹配的“捕获”之前的文本。 –

-1

,如果你使用全局修改,将你想要做什么......

var str = 'blablablalablabla'; //string without word 'capture' 
console.log(str.match(/.*(capture)?.*/ig)); // array[1] = "" 
+0

但我想捕获字符串 - 用'g'修饰符'()'不是捕获 - 我必须使用没有'g'修饰符的匹配 – Adidi

+0

你的意思是没有捕获到什么......'()'做定义捕获组..并存在于数组的索引1中。 – CaldasGSM

+0

如果我使用字符串:'var str ='blablabcapturelalablabla';'用单词capture它仍然返回空字符串,并且我想捕获单词capture if它呈现 – Adidi