REGEX - 匹配包含彼此相邻的字母的单词

时间:2014-11-13 08:39:01

标签: php regex

我正在寻找匹配不止一次重复一个字母并且彼此相邻的字词的正则表达式

以下是一个例子:

This is an exxxmaple oooonnnnllllyyyyy!

到目前为止,我还没有发现任何可以完全匹配的内容:

exxxmaple and oooonnnnllllyyyyy

我需要找到它并将它们放在一个数组中,如下所示:

preg_match_all('/\b(???)\b/', $str, $arr) );

有人可以解释我必须使用的正则表达式吗?

3 个答案:

答案 0 :(得分:2)

您可以使用非常简单的正则表达式

\S*(\w)(?=\1+)\S*

了解正则表达式在http://regex101.com/r/rF3pR7/3

的匹配情况
  • \S匹配空格以外的任何内容

  • *量词,\S

  • 零次或多次出现
  • (\w)匹配单个字符,在\1

  • 中捕获
  • (?=\1+)正面向前看。断言加盖字符后跟itsef \1

  • +量词,重复字符的一个或多个出现

  • \S*匹配空格以外的任何内容

修改

如果重复必须不止一次,那么对正则表达式稍作修改就可以了。

\S*(\w)(?=\1{2,})\S*

例如http://regex101.com/r/rF3pR7/5

答案 1 :(得分:2)

如果您想丢弃apple等字样

,请使用此选项
\b\w*(\w)(?=\1\1+)\w*\b

\b(?=[^\s]*(\w)\1\1+)\w+\b

试试这个。看看演示。

http://regex101.com/r/kP8uF5/20

http://regex101.com/r/kP8uF5/21

答案 2 :(得分:1)

您可以使用此模式:

\b\w*?(\w)\1{2}\w*

\w类和字边界\b将搜索范围限制为单词。请注意,可以删除单词边界,但是,它会减少获得匹配的步骤数(作为延迟量词)。另请注意,如果您要查找单词(通常含义),则需要删除单词边界并使用[a-zA-Z]代替\w

(\w)\1{2}检查是否存在重复的字符。在第1组中捕获单词字符,并且必须跟随捕获组的内容(反向引用\1)。