正则表达式中的以下语法有什么区别?
请举个例子。
(?=.*\d)
和
.*(?=\d)
答案 0 :(得分:4)
第一个是只是一个断言,一个积极的预测说“必须有零个或多个字符后跟一个数字。”如果将它与包含至少一个数字的字符串匹配,它将告诉您断言是否为真,但匹配的文本只是一个空字符串。
第二个搜索一个匹配,在比赛后有一个断言(一个正面向前),说“必须有一个数字”。匹配的文本将是字符串中最后一位数字之前的字符(包括任何前面的数字,因为.*
是贪婪的,所以它会消耗数字直到最后一位,因为断言需要最后一位数字。 )。
请注意匹配对象结果的差异:
var str = "foo42";
test("rex1", /(?=.*\d)/, str);
test("rex2", /.*(?=\d)/, str);
function test(label, rex, str) {
console.log(label, "test result:", rex.test(str));
console.log(label, "match object:", rex.exec(str));
}
输出(对于那些无法运行代码段的人):
rex1 test result: true rex1 match object: [ "" ] rex2 test result: true rex2 match object: [ "foo4" ]
注意第二种情况下的匹配结果是foo4
(来自字符串foo42
),但在第一种情况下是空白。
答案 1 :(得分:1)
(?=...)
是positive lookahead。这两个表达式都匹配"任何文本后跟数字"。不过,不同之处在于(?=...)
并没有“吃掉”#34; ("捕获")匹配的任何字符。出于实际目的,如果这是你的正则表达式所包含的唯一内容,那么它们将匹配相同的东西。但是,.*(?=\d)
将是一个更正确的表达方式,除非它比您在问题中提供的内容更多。
真正重要的是当您使用捕获群组或在运行正则表达式后您使用匹配文本的内容时:
如果你想要在数字之前捕获所有文本,而不是数字本身,并在之后使用它,你可以这样做:
(.*?(?=\d))
?
使得比赛非贪婪,因此它只会匹配第一个数字。导致该号码的所有文本都将作为第一组在匹配结果中。
答案 2 :(得分:0)
请在下面找到差异 详细
。*表示匹配任何字符(换行符除外)
(?= \ d)表示正向前瞻 - 断言下面的正则表达式可以匹配
\ d匹配数字[0-9]
(?=。* \ d)
CapturingGroup
MatchOnlyIfFollowedBy
顺序:按顺序匹配以下所有内容
重复
AnyCharacterExcept \ n
零次或多次
数字
。*(?= \ d)
顺序:按顺序匹配以下所有内容
重复
AnyCharacterExcept \ n
零次或多次
CapturingGroup
MatchOnlyIfFollowedBy
数字