我想匹配重复的单词,例如abc abc
。这是正则表达式:
(\w+)(\s\1)+
这对于像这样的字符串非常有用:
pds dd dd dd dd sd
并将dd dd dd dd
和"dd"
," dd"
分组匹配,但这不是我想要的。
我想分别匹配dd
,就像split语句围绕" "
拆分并返回4 dd
。除了单个正则表达式外,我没有寻找任何其他方法。可以使用两个正则表达式来完成,但是我想知道是否可以在单个正则表达式中编写吗?
答案 0 :(得分:4)
我最终使用了此正则表达式:
(\w+)(?(?=\s+\1\s+\1)|\s+\K(\1))
它不需要解释,因为正则表达式在Regex101上有很清楚的解释。
(?something|anotherthing)
看起来像一个if else
语句。如果存在something
,则匹配它,否则尝试找到anotherthing
。
在上述正则表达式中,TRUE
是null
,因此该正则表达式有效。
这是revo编写的另一个正则表达式,它不能捕获多个组:
(?|\b(\w+)(?= +\1\b) +|\G(?!^)(\w+))
答案 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
)