Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式中带可选前导单词/短语的强制最后一个单词_Java_Regex - Fatal编程技术网

Java正则表达式中带可选前导单词/短语的强制最后一个单词

Java正则表达式中带可选前导单词/短语的强制最后一个单词,java,regex,Java,Regex,我在Java中遇到以下正则表达式的问题。我已经删除了引号上的加倍,以使其更具可读性。由于缺少更好的单词,我还将每个“组件”放在单独的一行上(但实际的表达式会将这些行合并,它们之间没有空格): (?:\bIN(?:\s*,)?)? (?:\bVOL.?(?:U[NM]TARY)?(?:\s*,)? \b(?:LIQ'N | LIQ | LQD | LIQD | LIQN | LIQUIDA |清算| REC |破产管理| RECSHIP |清盘)\b 基本上,最后一个单词/表达是强制性的,但前面的

我在Java中遇到以下正则表达式的问题。我已经删除了引号上的加倍,以使其更具可读性。由于缺少更好的单词,我还将每个“组件”放在单独的一行上(但实际的表达式会将这些行合并,它们之间没有空格):

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

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

在自愿清算中
体积液体
体积液体
清算中
在液体中
体积液体
体积液体
体积液体
INLIQ
非流动性
清算中
在液体中
单位:体积液体
在体积上,LIQN
清算
破产管理

这些短语将混合到字符串中,我需要删除它们。这些短语通常用
[
]
括起来,但这不是必然的,这就是我使用单词边界标记的原因


我无法检测前面的单词,只有最后一个单词匹配。请注意,正则表达式的性能并不是我主要关心的问题(也就是说,如果必要,这将是一个后台过程,可能需要花费时间)。任何正则表达式专家都能帮我解决这个问题吗?

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


此时,在集合中添加搜索词并迭代/替换正在解析的文本中的任何内容不是更容易吗?但有太多的可能性,这就是为什么我认为正则表达式会更简洁的原因。此外,我很可能会发现未来需要删除的更多条款,这可能会大幅增加可能性的数量。当然,这并没有超出正则表达式的能力?这正是我不建议使用正则表达式的原因:想象一下一年后,当你的列表包含无数同义词和类似术语,而你已经不可读的正则表达式增长了十倍。。。相反,如果您有一组要删除的术语,那么您最好知道您只需要向其中添加一个术语并完成它。编辑-单元测试也会更好…@Mena好吧,这是一个合理的观点,但我不想完全放弃正则表达式。关于短语中的空格和可能的逗号位置,仍然存在很多不可预测的变化。这对静态字符串不起作用。我可能会考虑一种混合的方法,将插入到正则表达式中的短语集合来处理空白。这样,在没有模式应用的情况下,你肯定可以有一个模式集合——文字,并保持它(例如,当你找到类似的情况下,你想要概括的东西最初会变成文字)。这将使事情比单一的单片模式更容易阅读。不过,这也可能意味着性能上会有一点开销。答对了!事实上,这更好,因为它捕获多个逗号,它们之间可能有空格。谢谢