正则表达式:如何避免在条件

时间:2017-01-09 09:15:00

标签: java regex regex-negation

我在排除某些特殊情况时遇到问题。我已在此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

2 个答案:

答案 0 :(得分:2)

你可以试试这个:

^(?!X-MAS\s+TREE\s*)(?=.*TREE).*$

Explanation

  1. ^断言行开头的位置
  2. 否定前瞻(?!X-MAS\s+TREE\s*)
  3. \ s +匹配任何空格字符(等于[\ r \ n \ t \ f \ v])
  4. 肯定前瞻(?=.*TREE)断言下面的正则表达式匹配。*
  5. $断言行尾的位置
  6. 要覆盖评论的结构,您可以尝试消极看待

    \b.*(?<!X-MAS )TREE\b
    

    Tried here

答案 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