Подходим повторяющиеся слова - PullRequest
6 голосов
/ 22 апреля 2019

Я хочу сопоставить повторяющиеся слова, такие как abc abc.Вот регулярное выражение:

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

Это прекрасно работает для таких строк, как:

pds dd dd dd dd sd

и соответствует dd dd dd dd в качестве группы и "dd", " dd", но это не такто, что я ищу.

Я бы хотел сопоставить dd отдельно, как оператор разбиения, который разбивается вокруг " " и возвращает 4 dd.Я не ищу никаких других методов, кроме одного регулярного выражения.Это можно сделать с помощью двух регулярных выражений, но мне интересно, можно ли написать в одном регулярном выражении?

Ответы [ 2 ]

4 голосов
/ 22 апреля 2019

В итоге я использовал это регулярное выражение:

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

Это не нуждается в объяснении, потому что регулярное выражение очень четко объяснено в Regex101 .

(?something|anotherthing)выглядит как if else заявление.Если присутствует something, сопоставьте его, попробуйте найти anotherthing.

В приведенном выше регулярном выражении TRUE равно null, и, следовательно, регулярное выражение работает.

Вот еще одно регулярное выражениенаписанный revo , который не охватывает несколько групп:

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

Второе регулярное выражение в действии

0 голосов
/ 22 апреля 2019

Преобразование строки в массив с помощью функции explode () с пробелом.

Найти количество значений, повторяемых array_count_values ​​()

<code><?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 '
';

Выход:

dd is repeated 4 times

Array
(
    [pds] => 1
    [dd] => 4
    [sd] => 1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...