我在排除某些特殊情况时遇到问题。我已在此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 )
答案 0 :(得分:2)
你可以试试这个:
^(?!X-MAS\s+TREE\s*)(?=.*TREE).*$
(?!X-MAS\s+TREE\s*)
(?=.*TREE)
断言下面的正则表达式匹配。* 要覆盖评论的结构,您可以尝试消极看待
\b.*(?<!X-MAS )TREE\b
答案 1 :(得分:1)
如果您想匹配前面没有TREE
的整个单词X-MAS
和空格,您可以使用负面的后置(?<!X-MAS\\s)
(或者,以确保{{ 1}}是一个完整的单词,X-MAS
):
(?<!\\bX-MAS\\s)
请参阅regex demo。
此外,如果可以有超过1个空格,例如,从1到10,您可以在String pat = "\\b(?<!X-MAS\\s)TREE\\b";
之后添加限制量词 {1,10}
以确保更多仍占1个空白:
\s
此处,即使String pat = "\\b(?<!X-MAS\\s{1,10})TREE\\b";
和X-MAS
之间没有或最多有10个空格,负面条件(所谓的constrained-width negative lookbehind)也会有效。
请参阅this Java demo。