匹配重复的单词

时间:2019-04-22 11:13:13

标签: php regex

我想匹配重复的单词,例如abc abc。这是正则表达式:

(\w+)(\s\1)+

这对于像这样的字符串非常有用:

pds dd dd dd dd sd

并将dd dd dd dd"dd"" dd"分组匹配,但这不是我想要的。

我想分别匹配dd,就像split语句围绕" "拆分并返回4 dd。除了单个正则表达式外,我没有寻找任何其他方法。可以使用两个正则表达式来完成,但是我想知道是否可以在单个正则表达式中编写吗?

2 个答案:

答案 0 :(得分:4)

我最终使用了此正则表达式:

(\w+)(?(?=\s+\1\s+\1)|\s+\K(\1))

它不需要解释,因为正则表达式在Regex101上有很清楚的解释。

(?something|anotherthing)看起来像一个if else语句。如果存在something,则匹配它,否则尝试找到anotherthing

在上述正则表达式中,TRUEnull,因此该正则表达式有效。

这是revo编写的另一个正则表达式,它不能捕获多个组:

(?|\b(\w+)(?= +\1\b) +|\G(?!^)(\w+))

Second regex in action

答案 1 :(得分:-1)

通过explode()将字符串转换为带有空格的数组。

查找由array_count_values()重复的值的数量

<?php 
$str = 'pds dd dd dd dd sd';
$arr = explode(' ', $str);
$countValues = array_count_values($arr);
if (! empty($countValues)) {
 foreach ($countValues as $countKey => $countValue) {
  if ($countValue > 1) {
   echo "<br/>" . $countKey . ' is repeated ' . $countValue . ' times';
  }
 }
}
echo '<pre>';
print_r($countValues);
echo '</pre>';

输出:

dd is repeated 4 times

Array
(
    [pds] => 1
    [dd] => 4
    [sd] => 1
)