我只想捕获一些出现的字符串,所以我要在捕获?之后使用(),这意味着我想捕获该字符串的那部分,但是不必显示(零或一个),但是当我添加在?之后删除匹配项:

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/

10-13 00:17