我在使用Java中的以下正则表达式时遇到麻烦。我删除了加倍的引号,以使其更具可读性。由于缺少更好的词,我也将每个“组件”放在单独的行上(但实际的表达方式是将行合并在一起,行之间没有空格):


  (?:\ bIN(?:\ s *,)?)
  (?:\ bVOL.?(?:U[NM]TARY)?)?(?:\s*,)?
  \ b(?:LIQ'N | LIQ | LQD | LIQD | LIQN | LIQUIDA |清算| REC |收据|收据|清盘)\ b


本质上,最后一个单词/表达式是强制性的,但是前面的单词IN和VOLUNTARY(或其某些版本)是可选的。这是我希望此模式匹配的一些字符串示例:


  自愿清盘
  VOL LIQ
  成交量
  液化
  IN LIQ
  VOL LIQ
  音量
  卷生活质量
  IN LIQ
  IN VOL液化
  液化
  IN LIQ
  IN,VOL。生活质量
  立陶宛
  液化
  收货人


这些短语将混合成字符串,我需要将其删除。这些短语通常将用[]()括起来,但这并不是确定的,这就是为什么我使用单词边界标记。

我在检测前面的单词时遇到问题,只有最后一个单词被匹配。请注意,正则表达式的性能对我而言并不是主要的问题(即,如果需要的话,这将是一个后台过程,可能需要一些时间)。任何正则表达式专家都可以帮助我吗?

最佳答案

使用regex101调试器,您可以看到序列\s*,失败,也许您想要的是[\s,]*:用(?:\s*|,)?替换[\s,]*

original regex

the functionning regex

09-25 16:14