否定前瞻完全排除给定的组合

时间:2014-01-27 20:14:57

标签: c# regex negative-lookahead

我正在使用以下正则表达式

@"(?![iv][iv]?[i]?)(?![.])\b[a-z]+(['-][a-z]+)*[a-z]+\b"

匹配符合以下条件的字词:

  1. 有2个字符或更多([a-z]+(['-][a-z]+)*[a-z]+,括号中的内容允许连字符/撇号字)
  2. 其中没有句号(?![.])(例如,博士)
  3. 不是包含罗马数字I或V((?![iv][iv]?[i]?))的单词(例如,VII)
  4. 一般情况下运作良好,但如果其中一个单词是Vivian,则会排除该单词。似乎Vivian被排除在外,因为它是一个带有字符I和V的单词。我想编写一个负向预测,它只会排除仅由I或V或V组成的单词,如III或VII或V我怎么能让负面的前瞻不那么贪心?

1 个答案:

答案 0 :(得分:2)

这是你的正则表达式:

(?:
   [a-zABE-HJ-KNOQ-UWYZ'-]  # Any char from the previous list is allowed except C,D,I,L,M,P,V and X
 | [CDILVX](?![IVXLCDM]+\b) # C,D,I,L,V and X allowed if not part of a roman numeral
 | M(?!r?s?\.|D\b)  # M is allowed if not part of Mr., Ms., Mrs. or roman numeral MD
 | P(?!h\.D\.)      # P is allowed if not part of Ph.D.
){2,}

描述

Regular expression visualization

演示

http://regex101.com/r/nP8kO2

讨论

由于您使用的是C#,因此您可以使用[a-zABE-HJ-KNOQ-UWYZ'-]替换上述正则表达式[-'a-zA-Z-[CDILMPVX]],从而利用character class substraction。感谢@Rawling

RegexHero(适用于.NET的在线正则表达式测试程序)上查看它。

这个正则表达式对其背景是明智的。例如,单词DIV是指罗马数字中的 504 数字还是 div html标记?目前,正则表达式会拒绝DIV,因为它有一个fordidden序列:IV

参考