括号

时间:2016-02-12 18:29:35

标签: javascript regex

我想捕获一些字符串只有它出现所以我在捕获后使用? ()意味着我想捕获该字符串的那一部分但不必显示(零或一)但是当我在?之后添加()时,它会丢弃该匹配:

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,因为我使用?,这意味着零或者一个

2 个答案:

答案 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] = ""