正则表达式查找不带双“ L”的单词

时间:2020-04-10 15:31:09

标签: regex

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

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

  • 大->已捕获
  • 晕->被俘获

我尝试了很多组合,但没有一个接近。我想应该使用否定的前瞻,否定的后向捕获或“ \ 1”以前的捕获组,但是我从不完全了解如何使用这些,通常会避免这些,而我使用这些的所有尝试都失败了。

2 个答案:

答案 0 :(得分:4)

您可以使用

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

请参见regex demo

详细信息

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

答案 1 :(得分:1)

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

\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

当子例程的内容很复杂时,将子例程与命名的捕获组一起使用也可以提高可读性。我将其作为一般信息提及,在这里不一定提倡使用子例程。

相关问题