#php #регулярные_выражения
Пример текста: Объект <Московский государственный университет имени М. В. Ломоносова> — ведущий университет России. Этот университет был основан в 1755 году... Нужно такое регулярное выражение, которое будет искать в тексте все слова "университет", кроме тех, которые обрамлены символами < и > (выделил в примере жирным слово, которое искаться не должно). Для регулярок используется pcre (PHP). Уже час голову ломаю, ничего работающего придумать не удалось...
Ответы
Ответ 1
var s = "Объект <Московский государственный университет имени М. В. Ломоносова> — ведущий университет России. Этот университет был основан в 1755 году..." s.replace(/<[^>]*>|(университет)|./g, (m, u, i, s) => u && console.log(i)) Выводит 81 и 106.Ответ 2
То же, что и в ответе @Qwertiy, но на PHP: $replacer = function( $match ) { if ( @$match[1] ) { return "институт"; } else { return $match[0]; } }; $text = "Объект <Московский государственный университет имени М. В. Ломоносова> — ведущий университет России. Этот университет был основан в 1755 году..."; $re = "/(университет)|<.*?>/ius"; echo preg_replace_callback( $re, $replacer, $text ); http://ideone.com/CZVo9eОтвет 3
Вариант поиска для последующей замены preg_replace('/\G(?(?=<)(?>[^>]+)|[^<])+?\Kуниверситет/giu','институт',$str); ПримерОтвет 4
Как вариант, можно сначала убрать из строки содержимое <...>, а затем уже выполнять поиск по изменённой строке. Пример на perl: use strict; use warnings; $\="\n"; my $line = 'Объект <Московский государственный университет '. 'имени М. В. Ломоносова> — ведущий университет России. '. 'Этот университет был основан в 1755 году...'; # Этап 1-й удалить лишнее: всё, что внутри <...> my $string = ($line =~ s/<.*>//rg); # Этап 2-й затем обычный поиск по уже изменённой строке. while ($string =~ /(университет)/g) { print $1; }Ответ 5
(университет)(?![^>]*>) Пропускает слово, если далее присутствует закрывающая >, но не проверяет что была открывающая <. (К сожалению lookbehind assertion должно быть фиксированной длины.)
Комментариев нет:
Отправить комментарий