[英]Regular expression in JavaScript, always ‘undefined’ if use a grouping followed by a question mark
我想要做的是提取匹配的模式,但其中一個模式可以是可選的。 讓我們直接舉例。
我想要匹配的目標文本是,
<foo>\n<bar>\n#####<foo>\n#####<bar>
我的正則表達式是,
/(#{5})?/
( 我使用的原因是什么?這是因為特定的模式可以是可選的。例如,我不希望匹配完全是一個錯過,而不僅僅是這個模式的'undefined'。 )
我期望str.match()返回的是,
[ '#####',
'#####',
index: 12,
input: '<foo>\n<bar>\n#####<foo>\n#####<bar>' ]
但實際上是,
[ '',
undefined,
index: 0,
input: '<foo>\n<bar>\n#####<foo>\n#####<bar>' ]
如果我使用以下模式,它將工作正常。
/(#{5})+/
為什么?
我在nodejs / chrome和IE中嘗試了這個,但是沒有一個工作,這意味着這個行為在JS引擎中是一致的。 但它的行為與我嘗試過的眾多工具之一的行為方式不同, regexpal 。 我不確定這是工具本身的問題還是只是不同的實現。
var re = /(#{5})/;
console.log ("<foo>\n<bar>\n#####<foo>\n#####<bar>".match (re));
console.log ("<foo>\n<bar>\nfoo>\n<bar>".match (re));
輸出:
[ '#####',
'#####',
index: 12,
input: '<foo>\n<bar>\n#####<foo>\n#####<bar>' ]
null
如果它是可選的,則regexp在沒有匹配時失敗,如果失敗則返回null。
> /a/.exec("a")
[ 'a', index: 0, input: 'a' ]
> /a/.exec("b")
null
> "a".match(/a/)
[ 'a', index: 0, input: 'a' ]
> "b".match(/a/)
null
另外,不要使用String#match(),它比RegExp #exec()慢,並且都返回相同:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.