对于确实与规则相匹配的单词,我正在使用:
bw*(cei|bie|(?!c)w(?=ie))w*b
但是,不符合流行规则的单词,例如"科学"甚至"外国?"
回答您问的问题
你快到了!我调整了您现有版本的工作,而无需lookbehinds:
bw*(?:cie|bei|(?!c)wei)w*b
不同的是,bei|(?!c)wei
正在寻找一个非C w
,其次是" IE"或b
,后跟" IE"。(要匹配"要么"之类的单词。LookBehind版本找到了相同的内容,而是通过寻找" ie" s 不是在之前
您可以将您的问题查看为"与i之前的规则"匹配的单词,除了c'之后,很明显,您可以将"我i"提取到e&quot之前。解决方案,只是翻转i和e,这基本上是我所做的。
回答您没有问的问题,但是哪个更有趣
您的"解决问题"(适合该规则的正则是对所有情况的真正作用。例如,"八十年代"一词确实包含" tie"," tie"是在非c之后的e之前的i,因此您的正则是the tie tie'tie;但这也从" ei"开始,这是我不在c之后之前的e。因此,我们需要更严格的规则遵循以下规则:
- a)从" IE"开始或b)包含" CEI"或c)包含" IE"这是一个非C
w
。 - a)不是从" ei"开始的。b)不包含" cie"c)不包含" EI"。这是一个非C
w
。
这实际上是一个非常有趣的问题;我怀疑有几种解决方法的方法,有些我还没有想到,也许会更好。尽管如此,这还是我对"遵循规则"的"单词:
"的解决方案b(?!ei)((w(?!ie|ei))*(cei|((?!c)w|b)ie))+(w(?!ie|ei))*b
分解其背后的逻辑:
b(?!ei) # guarantee 2.a
(
(w(?!ie|ei))* # consume as many w not followed by ie or ei as possible
(cei|((?!c)w|b)ie) # 1.b or 1.c or 1.a (exclusively: none of 2.)
)+ # guarantee at least 1 match of 1.
(w(?!ie|ei))*b # any trailing w after the last match of 1. can't match 2.
其他注释:
- 是的,这是嵌套重复。由于两个部分都是互斥的,因此不应引起灾难性的回溯:
(w(?!ie|ei))
无法启动(cei|((?!c)w|b)ie)
的匹配。 - 我做一个假设序列" IEEI"不会出现;我的解决方案在严格不应该时与之匹配,但是此序列不会出现在我的计算机的字典中,因此我会认为这是稍后咀嚼的边缘案例。
- 与您的示例一样,这只能适用于全羊皮C,E和i。如果您仅查看小写字符串,则
w
可能不是要走的路。考虑[a-z]
。