繁体   English   中英

正则表达式:如何避免根据条件匹配字符串中的单词

[英]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\s+TREE\s*)(?=.*TREE).*$

说明

  1. ^声明行首的位置
  2. 负前瞻(?!X-MAS\\s+TREE\\s*)
  3. \\ s +匹配任何空格字符(等于[\\ r \\ n \\ t \\ f \\ v])
  4. 正向前(?=.*TREE)断言以下正则表达式与。*相匹配
  5. $在行尾声明位置

为了涵盖评论的结构,您可以尝试在后面进行负面评价

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

在这里试过

如果要匹配不带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-MASTREE之间没有空格或最多不超过10个空格,否定条件(所谓的约束宽度负向后看 )也将起作用。

请参阅此Java演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM