查找字母三元组除了列出的单词

时间:2014-10-04 17:22:37

标签: regex regex-negation

([^\W\dA-Z && (I|X|L|V|\.)])\1{2}适用于http://regex101.com/r/xB5sT0/1

\b(Fuss|Mass|Bloss|Gross)个案例外,如何使其有效?

所有列出的德语单词也可以在单词的中间,或以小写字母(fuss|mass|bloss|gross)开头

我不想匹配像 Fusssoldat 这样的复合词,因为我知道一切都没问题,因为 Fuss + soldat 很有意义

2 个答案:

答案 0 :(得分:0)

您可以使用丢弃技术,该技术包括将丢弃模式放在由管道(正则表达式OR)拆分的正则表达式的开头,并在末尾使用捕获组。如下所示:

discard patt 1 | discard this too | another discard pattern | (keep this)

所以,对于你的情况,你可以这样做:

\b(?:Fuss|Mass|Bloss|Gross)|([^\W\dA-Z && (I|X|L|V|\.)])\1{2}

然后访问捕获组以获取您的内容。

如果使用PCRE(Perl Compatible RegEx)正则表达式,则可以使用(*SKIP)(*FAIL)标记来丢弃匹配的模式。像:

\b(?:Fuss|Mass|Bloss|Gross)(*SKIP)(*FAIL)|([^\W\dA-Z && (I|X|L|V|\.)])\1{2}

如果你想了解更多关于这个技巧的信息,你可以看看这个优秀的主题:

Regex Pattern to Match, Excluding when... / Except between

答案 1 :(得分:0)

([^\W\dA-Z && (I|X|L|V|\.)])\1(?<!(?i)fuss|mass|bloss|gross)\1

Regular expression visualization

Debuggex Demo

我通过这种方式找到了解决方案:

  1. 您的主要模式([^\W\dA-Z && (I|X|L|V|\.)])
  2. 重复一次(!)\1(不像以前那样两次)
  3. 如果当前匹配不是以下任何一项,请查看背后:(?<!(?i)fuss|mass|bloss|gross)
  4. 再次重复主模式匹配以确保三次出现