我遇到了一个包含?:
个字符的正则表达式,例如:
(?:\s*)
所以这将匹配0个或更多空格字符,但我无法找到?:
的目的是什么。我知道,如果案例为':?'
,则:
是可选的,但?:
是什么?
答案 0 :(得分:0)
(x)匹配'x'并记住匹配,如下例所示 显示。括号称为捕获括号。
模式中的'(foo)'和'(bar)'/(foo)(bar)\ 1 \ 2 /匹配和 记住字符串“foo bar foo bar”中的前两个单词。 \ 1 和\ 2在模式中匹配字符串的最后两个单词。注意\ 1, \ 2,\ n用于正则表达式的匹配部分。在更换 正则表达式的一部分必须使用语法$ 1,$ 2,$ n,例如:'bar foo'.replace(/(...)(...)/,'$ 2 $ 1')。
(?:x)匹配'x'但不记得匹配。括号是 称为非捕获括号,并允许您定义子表达式 使用正则表达式运算符。考虑样本 表达式/(?:foo){1,2} /。如果表达式为/ foo {1,2} /,那么{1,2} 字符只适用于'foo'中的最后一个'o'。随着 非捕获括号,{1,2}适用于整个单词'foo'。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
答案 1 :(得分:0)
这是匹配但不捕获。在正则表达式处理中,(
)
内的所有内容都被视为可以匹配和捕获的公平游戏。区别在于结果数据。
要使用它,可能需要验证是否存在匹配模式; 但是一个人不希望所有构成匹配的材料。
为什么?
假设有一条规则,用户必须将短信添加到电话号码,例如303-555-1234
。通过使用匹配但不捕获我们可以要求与破折号匹配,但我们可以提取捕获只是将数字保存到数据库中。
(\d\d\d)(?:-)(\d\d\d)(?:-)(\d\d\d\d)
那么我们需要完全匹配上面的内容,但是当我们提取捕获时,我们只得到数字。
Match 0 : 303-555-1234
Match 1 : 303
Match 2 : 555
Match 3 : 1234
我认为这是一种为匹配提供锚以使其完整但不需要所有数据的方法。
使用ExplicitCapture选项仅捕获(
)
内的所有内容时,可以找到类似的内容,但不会在匹配项中留下任何非括号。