我想捕获一些字符串只有它出现所以我在捕获后使用?
()
意味着我想捕获该字符串的那一部分但不必显示(零或一)但是当我在?
之后添加()
时,它会丢弃该匹配:
var str = 'blablablacaptureblablabla';
如果我使用()
进行常规捕捉,我会获得欲望捕捉:
console.log(str.match(/.*(capture).*/i)); // array[1] = capture
如果我添加?
表示捕获可能与否可能完全未定义:
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 :(得分:4)
如果您希望始终初始化捕获值(为了避免捕获组#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] + '"';
答案 1 :(得分:-1)
如果您使用全局修饰符,它将执行您想要的操作...
var str = 'blablablalablabla'; //string without word 'capture'
console.log(str.match(/.*(capture)?.*/ig)); // array[1] = ""