我只想捕获一些出现的字符串,所以我要在捕获?
之后使用()
,这意味着我想捕获该字符串的那部分,但是不必显示(零或一个),但是当我添加在?
之后删除匹配项:
var str = 'blablablacaptureblablabla';
如果我使用
()
进行常规捕获,则会得到欲望捕获:console.log(str.match(/.*(capture).*/i)); // array[1] = capture
如果我添加
()
来指示捕获可能是或根本不是,我将无法定义:console.log(str.match(/.*(capture)?.*/i)); // array[1] = undefined
这是为什么 ?我想要的就是捕获单词
?
是否存在于字符串中,因此它不会返回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'
编辑:
只是要清楚一点-我希望此字符串
capture
捕获单词blablacaptureblabla
,并且也希望此字符串capture
不返回空值,原因是我使用blablablabla
表示零或一 最佳答案
如果要始终对捕获值进行初始化(以避免为捕获组#1设置undefined
值),则需要使用带有空交替的强制性组,并使用经过调节的贪婪令牌(?:(?!capture).)*
:
/^(?:(?!capture).)*(capture|).*/i
见regex demo
tempered greedy token是由(非)捕获组(
(?:...)
或(...)
)组成的特殊构造,该组与未开始特定序列(由负前瞻(?!...)
指定)的单个字符匹配,对其应用了量词。下面是一个JS演示:
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] + '"';
关于javascript - 括号后的javascript正则表达式问号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35369735/