Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Найти в тексте слова, которые не обрамлены < >

#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 должно быть фиксированной длины.)

Комментариев нет:

Отправить комментарий