正则表达式否定超前^。+(?!\ _ \ d {3} $)不起作用

时间:2019-07-09 05:50:06

标签: regex regex-lookarounds

正则表达式为:

^.+(?!\_\d{3}$)

必须匹配:abc_001_952010923

不得匹配:abc_001_952010923_002

我想使用负数前瞻,但似乎不起作用(这两种情况都匹配)。

https://regex101.com/r/0jt4ut/1

您的帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

我将用这种方式来表达您的正则表达式,在模式的开始处使用负的超前断言:

^(?!.*_\d{3}$).*$

这似乎有效in your updated demo

在当前模式中,负前行位置的问题是,可以通过使.+足够贪心来使两个输入字符串匹配。通过一开始就断言,可以确保我们剔除您不需要的输入。

要更好地了解abc_001_952010923_002实际如何传递当前的正则表达式,请考虑以下问题:

abc_001_952010923_002 
|   matched by .+  |   (everything matched except last 2)
                   ||  <-- (?!_\d{3}$) lookahead fires here

也就是说,.+可以消耗整个模式直到最终数字(2),然后可以使否定的超前通过。

答案 1 :(得分:0)

那这样的图案呢?

^[a-z]+_\d+_\d+$

Demo

您明确匹配每个组:

  • ^[a-z]+_第一组(下划线)带有下划线
  • \d+_第一组带有下划线的数字
  • \d+第二组数字
  • $字符串的结尾

答案 2 :(得分:0)

我的猜测是,此处可能不需要环视,并且此表达式可能只是完成了此任务:

^\D+_\d+_\d+$

该表达式在this demo的右上角进行了说明,如果您想进一步探索或修改它,在this link中,您可以逐步观察它如何与某些示例输入匹配步骤,如果您愿意的话。