为什么这个javascript正则表达式无法匹配2个连续的字符?

时间:2017-03-03 13:23:46

标签: javascript regex

来自Mozilla documentation

x{n,}   

Where n is a positive integer. Matches at least n 
occurrences of the preceding item x.

For example, /a{2,}/ doesn't match the "a" in "candy", 
but matches all of the a's in "caandy" and in "caaaaaaandy".

(x)     

Matches x and remembers the match. These are called capturing groups.

基于这两条信息,我假设以下

elmt1 = 'aba'
elmt1.match(/(.){2,}/g)

通常会返回null,因为我之前附上了该字符,并要求它至少返回2次。

我认为

elmt1 = 'aab'
elmt1.match(/(.){2,}/g)

通常会返回'aa'

但是,此方法始终返回所有内容,即整个字符串。 我有点困惑,因为在我看来它与文档中的内容相矛盾。

有人可以向我解释为什么这个正则表达式会返回所有内容吗?

谢谢大家!

3 个答案:

答案 0 :(得分:2)

我认为您希望(.)能够记住匹配的第一个字符,并(.){2,}来匹配该特定字符的至少2次出现,但这不是它的工作方式。 (.)会记住匹配并保存的字符,如果您想使用它,则必须使用\1(或\2\3 ...在哪个组你想要的。)

此外,您不应将量词应用于捕获组,因为它导致的行为几乎总是不是您想要的行为(该组匹配所有字符但只记住最后一个字符)。

在这种情况下,你想要的是(.)\1+,意思是:匹配任何一个字符后跟同一个字符,一次或多次。

答案 1 :(得分:1)

量词将组内容重新应用为正则表达式,而不是匹配。这并不是因为a.匹配,因此您将获得a。您将获得2个或更多.,这意味着任何两次或更多次。

这与后引用不同,例如\1,它将引用第1组匹配的内容。

答案 2 :(得分:1)

/.{2,}/相当于/..|...|....|.....|…/。因此,你的正则表达式将匹配任何东西,但单个字母(或空字符串)。