什么是正则表达式 (regex),用于匹配不遵循"i before e except after c"规则的单词?



对于确实与规则相匹配的单词,我正在使用:

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。因此,我们需要更严格的规则遵循以下规则:

  1. a)从" IE"开始或b)包含" CEI"或c)包含" IE"这是一个非C w
  2. 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.

其他注释:

  1. 是的,这是嵌套重复。由于两个部分都是互斥的,因此不应引起灾难性的回溯:(w(?!ie|ei))无法启动(cei|((?!c)w|b)ie)的匹配。
  2. 做一个假设序列" IEEI"不会出现;我的解决方案在严格不应该时与之匹配,但是此序列不会出现在我的计算机的字典中,因此我会认为这是稍后咀嚼的边缘案例。
  3. 与您的示例一样,这只能适用于全羊皮C,E和i。如果您仅查看小写字符串,则w可能不是要走的路。考虑[a-z]

相关内容

  • 没有找到相关文章

最新更新