尝试获取仅包含一个连续字母“ l”(不区分大小写)的文本中的所有单词。
例如:
“你好,你看到太阳周围的大光环了吗?”
我尝试了很多组合,但没有一个接近。我想应该使用否定的前瞻,否定的后向捕获或“ \ 1”以前的捕获组,但是我从不完全了解如何使用这些,通常会避免这些,而我使用这些的所有尝试都失败了。
答案 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
正则表达式引擎执行以下操作。
\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
当子例程的内容很复杂时,将子例程与命名的捕获组一起使用也可以提高可读性。我将其作为一般信息提及,在这里不一定提倡使用子例程。