【问题标题】:Regex to find words without double "L"正则表达式查找没有双“L”的单词
【发布时间】:2020-04-10 15:31:09
【问题描述】:

尝试获取文本中仅包含一个连续字母“l”的所有单词,不区分大小写。

例如:
“你好,你看到太阳周围的大光环了吗?”

  • 大 -> 捕获
  • 光环 -> 捕获

我尝试了很多组合,但没有一个能接近。我想我应该使用负前瞻、负后瞻或“\1”之前的捕获组,但我从来没有完全理解如何使用这些通常避免使用这些,并且我所有尝试使用这些都失败了。

【问题讨论】:

  • 你应该把它当作“匹配一个单词与l,除非它包含ll” - > \b(?!\w*?ll)\w*l\w*
  • \b\w*(?<!l)l(?!l)\w*will matchillegal\b(?!\w*?ll)\w*l\w*won't

标签: regex


【解决方案1】:

你可以使用

(?i)\b(?!\w*?ll)\w*l\w*
/\b(?!\w*?ll)\w*l\w*/i

regex demo

详情

  • (?i) - 不区分大小写模式开启
  • \b - 单词边界
  • (?!\w*?ll) - 不允许在任何 0+“单词”字符后使用 ll:数字、字母、_s(尽可能少)
  • \w*l\w* - 0+ 个单词字符,l 和 0+ 个单词字符。

【讨论】:

  • 谢谢! +1解释!我总是很难用“?!”和 ”!?”断言,无论我读了多少关于它们的文章
【解决方案2】:

您可以使用以下正则表达式(设置了不区分大小写标志),它应该适用于大多数正则表达式引擎。

\b[a-km-z]*l(?:[a-km-z]+l)*[a-km-z]*\b

Demo

正则表达式引擎执行以下操作。

\b           # match a word break
[a-km-z]*    # match 0+ letters other than 'l'
l            # match 'l'
(?:          # begin non-capture group
  [a-km-z]+  # match 1+ letters other than 'l'
  l          # match 'l' 
)            # end non-capture group
*            # execute non-capture group 0+ times
[a-km-z]*    # match 0+ letters other than 'l'
\b           # match a word break

使用 PCRE (PHP) 和其他一些正则表达式引擎,您可以使用 subroutine calls 来减少重复和出错的机会。就是这里

\b([a-km-z])*l(?:(?1)+l)*(?1)*\b

\b(?P<allbutl>[a-km-z])*l(?:(?P>allbutl)+l)*(?P>allbutl)*\b

使用带有命名捕获组的子程序,当后者的内容复杂时,也可以提高可读性。我将此作为一般信息提及,并不一定提倡在此使用子程序。

【讨论】:

  • 不错的答案(不确定是否是故意的,但字符类也会匹配逗号)+1
  • @Thefourthbird,你不得不承认逗号看起来更好。这是那些“永远不知道为什么”的剧集之一。我会在 PDT 早上修复它。谢谢。
  • @CarySwoveland 你不得不承认逗号看起来更好 - 不,它没有,因为如果有问题,它无论如何都不是“更好“说到代码。在您解决此问题之前,应投反对票。还有一件事:_ 在某些正则表达式风格的命名组名中是不允许的,我也会从示例中删除它。
  • @Wiktor,我对自嘲幽默的微弱尝试似乎没有成功。哦,好吧。
猜你喜欢
  • 2019-06-19
  • 2021-12-30
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
相关资源
最近更新 更多