正则表达式前瞻只删除最后一个字符
Regex lookahead only removing the last character
我正在创建一个用于搜索文本的正则表达式,但前提是匹配后没有破折号。我为此使用前瞻:
- 正则表达式:
Text[\s\.][0-9]*(?!-)
Expected result Result
--------------- -------
Text 11 Text 11 Text 11
Text 52- <No Match> Text 5
测试用例:https://regex101.com/r/doklxc/1/
前瞻似乎只与前一个字符匹配,这给我留下 Text 5
,而我需要它根本 return 不匹配。
我正在查看 https://www.regular-expressions.info/ 指南并尝试使用群组,但我无法理解这个。
我怎样才能使后视功能影响整个前面的匹配?
我正在使用默认的 .Net Text.RegularExpressions 库。
[0-9]*
回溯并让正则表达式引擎找到匹配项,即使存在 -
。
有两种方法:使用原子组或在前瞻中检查数字:
Text[\s.][0-9]*(?![-\d])
或者
Text(?>[\s.][0-9]*)(?!-)
参见regex demo #1 and the regex demo #2。
详情
Text[\s.][0-9]*(?![-\d])
匹配 Text
,然后是一个点或一个空格,然后是 0 个或多个数字,然后它检查是否有一个 -
或紧靠右边的数字,如果有,则匹配失败。即使尝试回溯并匹配比之前抓取的数字更少的数字,前瞻中的 \d
也会使这些尝试失败
Text(?>[\s.][0-9]*)(?!-)
匹配 Text
,然后一个原子组开始,在组模式找到它们的匹配文本后不会让回溯进入。 (?!-)
仅在 [0-9]*
模式尝试获取任何数字后检查 -
。
我正在创建一个用于搜索文本的正则表达式,但前提是匹配后没有破折号。我为此使用前瞻:
- 正则表达式:
Text[\s\.][0-9]*(?!-)
Expected result Result
--------------- -------
Text 11 Text 11 Text 11
Text 52- <No Match> Text 5
测试用例:https://regex101.com/r/doklxc/1/
前瞻似乎只与前一个字符匹配,这给我留下 Text 5
,而我需要它根本 return 不匹配。
我正在查看 https://www.regular-expressions.info/ 指南并尝试使用群组,但我无法理解这个。
我怎样才能使后视功能影响整个前面的匹配?
我正在使用默认的 .Net Text.RegularExpressions 库。
[0-9]*
回溯并让正则表达式引擎找到匹配项,即使存在 -
。
有两种方法:使用原子组或在前瞻中检查数字:
Text[\s.][0-9]*(?![-\d])
或者
Text(?>[\s.][0-9]*)(?!-)
参见regex demo #1 and the regex demo #2。
详情
Text[\s.][0-9]*(?![-\d])
匹配Text
,然后是一个点或一个空格,然后是 0 个或多个数字,然后它检查是否有一个-
或紧靠右边的数字,如果有,则匹配失败。即使尝试回溯并匹配比之前抓取的数字更少的数字,前瞻中的\d
也会使这些尝试失败Text(?>[\s.][0-9]*)(?!-)
匹配Text
,然后一个原子组开始,在组模式找到它们的匹配文本后不会让回溯进入。(?!-)
仅在[0-9]*
模式尝试获取任何数字后检查-
。