我正在使用以下正则表达式
@"(?![iv][iv]?[i]?)(?![.])\b[a-z]+(['-][a-z]+)*[a-z]+\b"
匹配符合以下条件的字词:
[a-z]+(['-][a-z]+)*[a-z]+
,括号中的内容允许连字符/撇号字)(?![.])
(例如,博士)(?![iv][iv]?[i]?)
)的单词(例如,VII)一般情况下运作良好,但如果其中一个单词是Vivian
,则会排除该单词。似乎Vivian
被排除在外,因为它是一个带有字符I和V的单词。我想编写一个负向预测,它只会排除仅由I或V或V组成的单词,如III或VII或V我怎么能让负面的前瞻不那么贪心?
答案 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,}
由于您使用的是C#
,因此您可以使用[a-zABE-HJ-KNOQ-UWYZ'-]
替换上述正则表达式[-'a-zA-Z-[CDILMPVX]]
,从而利用character class substraction。感谢@Rawling。
在RegexHero(适用于.NET的在线正则表达式测试程序)上查看它。
这个正则表达式对其背景是明智的。例如,单词DIV
是指罗马数字中的 504 数字还是 div html标记?目前,正则表达式会拒绝DIV
,因为它有一个fordidden序列:IV
。