[regexp]помогите плз убрать дубли
тебе обязательно с помощью regexp эту задачу надо решить? тогда, боюсь, ни фига не выйдет
Ну как не выйдет? regexp разные бывают ;-)
именно с помощью регэксп
А что, ими правда можно все дубли удалить?
не, серьёзно, напиши хоть какие регекспы у тебя?
причем это задачка для начинающего, там должно быть что-то не оч сложное
А что, ими правда можно все дубли удалить?я не прожжен в этой теме. Т.е. мне сложно судить на глаз можно или нет.
Ну вот если ты начинающ(ая напиши тут regexp, выделяющий отдельное слово, отделенное пробелами.
<?php
$text = 'ааа бббб ввв ааа дддддд';
$find = '#(?<=\s|^\w+\s.*?)?\s\1#';
$repl = '$1$2';
while($res = preg_replace($find, $repl, $text) and $res!=$text)
$text = $res;
print $text;
?>
в конце наверное забыл (?=\s|$) , но в цикле вызывать все равно неспортивно..
давай я сейчас на .NET напишу. Странная шутка в общем.
Это считая, что слова отделены пробелами, причём с обоих сторон.
Можно заморочиться, но мысль ясна.
Копать по '\n - означает n-ую найденную группу'
в конце наверное забыл (?=\s|$)Есть такое
, но в цикле вызывать все равно неспортивно..не хотите циклы, получите рекурсию
<?php
$text = 'ааа бббб ввв ааа дддддд ввв ччч ааа';
//$text = "aaa\naaa";
$find = '#(?<=\s|^\w+\s.*?)?\s\1(\s.*)?$#e';
$repl = 'preg_replace($find, $repl, "$1$2".preg_replace("/\s".preg_quote("$1", "/")."(?=\s|$)/", "", "$3"';
$text = preg_replace($find, $repl, $text);
//while($res = preg_replace($find, $repl, $text) and $res!=$text)
// $text = $res;
print '"'.$text.'"';
?>
upd: просто регекспом не получится, так как повторяться могут разные слова и их зоны повторения могут пересекаться, а поиск следующего вхождения начинается после текущего вхождения.
upd2: поправил код
давай я сейчас на .NET напишу. Странная шутка в общем.А это и не шутка. Скорее всего, регексп предстоит использовать в программе, которая пишется на некотором языке и в большинстве случаев будет какая-то своя специфика в тех или иных мелочах. А так как язык не был указан, никто мне не мешает выбрать его произвольно.
\W|\A\w+\W|\W.*\W\3(\W|\z)
заменить на
$1$5
Правда оно не сработает на пересекающихся парах
upd поправил
Правда оно не сработает на пересекающихся парахвот именно поэтому я прописал сперва цикл, а потом - рекурсию.
большое-большое спасибо!
просто регекспом не получитсяа рекурсию в регэкспы разве еще не добавили?
допустим, что-то такое там есть и это может помочь сразу найти все вхождения одного из слов и, возможно, убрать все его повторы (хотя, прочитав соответствующий раздел, я сходу не готов написать регексп, делающий это но как ты собираешься обрабатывать строку с множественными (>2) вхождениями более одного слова исключительна средствами regexp'а (без привлечения средств языка, из-под которого вызывается поиск/замена по регекспу)?
и дальше дать регэксп ищущий 2 одинаковых слова и удаляющий второе
т.е. должно быть что-то типа
s/(\w.*\1)/\1\2/r
s - замена, (\w) - первое слово, (.*) - остальные слова, (\1) - второе слово равное первому, r - флаг рекурсии
(\W|\A\w+?=(\W|\W.*\W\2\W|\z -> $1
Убирает дубликаты (в том числе вложенные но только их первые вхождения.
Думаю, можно убирать и последние, но с темой (? пока полностью не разобрался
Это считая, что слова отделены пробелами
[[:space:]]
?
Думаю, можно убирать и последние, но с темой (? пока полностью не разобралсяс этим сложно, в силу ограничений, наложенных на (?<= и (?<!, а именно - запрета на переменную длину предшествующего подшаблона. Вот если бы в условных подмасках можно было бы просматривать весь предшествующий текст...
Кстати, (\W|\A) можно заменить на \b
Оставить комментарий
Pati_D
В исходной строке нужно удалить дубликатные слова.пример:
Вход: ааа бббб ввв ааа дддддд
Выход: ааа бббб ввв дддддд