[英]Regex : How to avoid matching a word in a string upon a condition
我在排除某些特殊情况时有问题。 我已经在此LINK中创建了示例。
如果我有这样的句子列表:
X-MAS TREE //it should be excluded because match my dictionary
BLA BLA TREE
XMAS TREE
X-MASTREE
X-TREE
X-MASTREE
我有X-MAS TREE具有同义词的字典: XMAS TREE,X-MASTREE,X-TREE,TREE 。 而且我需要将所有同义词单词都更改为我的词典单词。
如何排除X-MAS TREE ? 因为所有这些正则表达式都将被X-MAS TREE替换如果我用关键字TREE搜索,它将是无限循环,因为X-MAS TREE具有TREE
我已经尝试了多种组合,但无法正常工作:
\b(XMAS TREE|X\-MASTREE|X\-TREE|TREE|(?!X\-MAS TREE)\b
\b(XMAS TREE|X\-MASTREE|X\-TREE|(?!X\-MAS \s)TREE)\b
\b(XMAS TREE|X\-MASTREE|X\-TREE|((?!X\-MAS )|\w*)TREE)\b
\b(XMAS TREE|X\-MASTREE|X\-TREE|(?:(?!X\-MAS) )TREE)\b
编辑
我需要使用Boundaries(出于某种原因),因为我在代码中使用循环创建了正则表达式,并且需要将其用于另一个Dictionary,这就是为什么在这种情况下,我需要特殊条件(无需更改结构代码,只编辑正则表达式TREE )
如果要匹配不带X-MAS
的整个单词TREE
和空格,则可以在后面使用否定后缀(?<!X-MAS\\\\s)
(或确保X-MAS
是整个单词(?<!\\\\bX-MAS\\\\s)
):
String pat = "\\b(?<!X-MAS\\s)TREE\\b";
参见regex演示 。
另外,如果可以有1个以上的空格,例如从1到10,则可以在\\s
之后添加一个限制量 {1,10}
,以确保仍然考虑了1个以上的空格:
String pat = "\\b(?<!X-MAS\\s{1,10})TREE\\b";
在这里,即使X-MAS
和TREE
之间没有空格或最多不超过10个空格,否定条件(所谓的约束宽度负向后看 )也将起作用。
请参阅此Java演示 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.