【问题标题】:RegEx for matching digits not followed by specific patternRegEx 用于匹配未跟随特定模式的数字
【发布时间】:2019-10-17 08:12:00
【问题描述】:

我正在尝试构建一个正则表达式来匹配以下线条样式:

123 warehouse
124 token warehouse.
153token token abc123; etc. - warehouse 
223abdc token abc green warehouse 

但不是这些行:

53red warehouse.
323 green token token etc warehouse. 

我构建的正则表达式使用负前瞻,但在 https://regex101.com/ 上测试它匹配所有行:

\d+(?!( ?red| ?green)).*(\bwarehouse\b)

错误是什么,应该如何修改?如果重要的话,正则表达式应该在 Java 下编译(在转义必要的字符之后)。

【问题讨论】:

  • 您能说明一下您的要求吗?你想避免第二批呢?我能猜到的是,您想避免某些单词(“red”、“green”)出现在“warehouse”之前的行吗?这些是唯一需要考虑的三个词,还是还有更多?
  • 我想避免在数字后面紧跟几个字(例如红色或绿色)。稍后在表达式中它们应该被允许,请参见第 4 个示例。还有几个固定词,都可以用析取词来表达(?red| ?green|?blue|?yellow)

标签: java regex regex-lookarounds regex-negation regex-greedy


【解决方案1】:

如果您使用 possessive quantifier 来防止回溯,您的模式有效:

\d++ 而不是\d+

Here is a demo at regex101 是 pcre 但 Java 正则表达式也应该支持这些。

【讨论】:

  • 这是一个很好的解决方案。虽然你可以改善结果。 +1
【解决方案2】:

123red warehouse.

您的正则表达式匹配 1 个或多个数字 12 然后不是红色或绿色 3red 然后是任何字符 a space warehouse

在第一个数字之后添加负前瞻:

\d+(?!\d)(?! ?(?:red|green)).*(\bwarehouse\b)

DEMO

【讨论】:

  • 为什么不使用所有格量词?在这种情况下,将没有回溯,因此获得结果的步骤更少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多