Меню

Главная
Случайная статья
Настройки
Википедия:Регулярные выражения
Материал из https://ru.wikipedia.org

Внутренний поиск MediaWiki поддерживает фильтр по регулярным выражениям. Поскольку текстовый поиск (включая поиск по исходному коду insource:) игнорирует знаки препинания, а буквы приводит в единый регистр, регулярные выражения — это единственный способ искать точную подстроку с учётом регистра.

Синтаксис ключа: insource:/регулярное выражение/

Памятка:
  1. Не забывайте экранировать все метасимволы, даже если это кажется вам избыточным (подробнее).
  2. Раскрывайте символьные классы (подробнее).
  3. Ограничивайте область поиска дополнительными ключами (подробнее).


Содержание

Краткая справка по регулярным выражениям

Регулярные выражения — формальный язык, используемый в задачах на поиск и замену подстроки в тексте. Поскольку поиск MediaWiki накладывает свои ограничения, некоторые из которых контринтуитивны, данная справочная страница подразумевает, что вы уже знакомы с регулярными выражениями и умеете ими пользоваться. Тем не менее, краткая шпаргалка по синтаксису регулярных выражений может быть полезна:
  • Буквы и цифры в регулярном выражении используются для посимвольного поиска. Так, регулярное выражение АК2 в тексте «Kaganer принимал участие в АК1, АК2, АК4, АК5, АК7, АК28 и АК29» найдёт три вхождения (выделены зелёным).
  • Квадратные скобки обозначают набор символов. Так, регулярное выражение co[dvw]er найдёт любое из слов «coder», «cover» и «cower».
    • Дефис внутри набора символов обозначает диапазон: [0-9] — любая цифра, [А-ЯЁа-яё] — любая буква русского алфавита («ё» не находится между «а» и «я» в таблице Юникода, потому её нужно указывать отдельно).
    • Символ ^ в после открывающей квадратной скобки инвертирует набор: [^0-9] — не цифра; [^ ] — любой символ, кроме пробела.
  • Символ точки обозначает «любой символ». Так, выражение хорош.. найдёт «хороший», «хорошая», «хорошее», и так далее — а также, например, подстроку «хорош к» в тексте «хорош кузнец».
  • В фигурных скобках можно указать число повторений: a{3} найдёт «aaa», [0-9]{2,4} найдёт число длиной от 2 до 4 символов, [А-ЯЁа-яё]{5,} найдёт русское слово длиной от 5 до бесконечности букв.
    • Знак вопроса обозначает, что предыдущий символ может быть опущен (аналогично {0,1}): так, регулярное выражение colou?r найдёт слова «color» и «colour».
    • Знак звёздочки означает, что предыдущий символ может быть повторен от 0 до бесконечности раз (аналогично {0,}): lo*l найдёт «ll», «lol», «lool», и так далее.
    • Знак плюса означает, что предыдущий символ может быть повторен от 1 до бесконечности раз (аналогично {1,}): lo+l найдёт «lol», «lool», «loool», и так далее.
  • Круглые скобки объединяют символы в единую группу, следующее за закрывающей скобкой число повторений будет относиться ко всей группе. Так, ха(-ха)+ найдёт подстроки «ха-ха», «ха-ха-ха», «ха-ха-ха-ха», и так далее.
  • Символ «|» делит группу (в случае, если «|» находится внутри скобок) или выражение (если вне) на два; поиск найдёт любое из них. Так, выражение co[dvw]er может быть переписано в виде coder|cover|cower, либо в виде co(d|v|w)er.
  • Если вам нужно найти в строке символ, имеющий специальное назначение — например, символ из списка выше, — вам нужно его экранировать, добавив перед ним символ «\». Так, выражение, ищущее код {{примечания|2}}, будет выглядеть следующим образом: \{\{примечания\|2\}\}. Если вы не уверены, какие символы являются управляющими, вы можете добавлять «\» к любому символу, кроме букв и цифр.


Особенности поиска MediaWiki

В основе регулярных выражений движка Lucene, используемого в MediaWiki, лежат расширенные регулярные выражения POSIX, но есть и различия:
  • Оператор точка . находит любые символы, включая перевод строки.
  • Операторы ^ (начало строки) и $ (конец строки) доступны только при поиске в названиях страниц (ключ intitle://), но не при поиске в исходном коде страниц (ключ insource://). При сопоставлении заголовков ^ и $ соответствуют началу и концу заголовка.
  • Поддерживаются «ленивые» операторы (например, .*?).
  • Добавлен оператор <> для поиска по диапазону чисел, например: <1997-2006> год в компьютерных играх
  • Для нечувствительности к регистру можно дописать i после закрывающего слэша: insource:/регулярное выражение/i.
  • Для экранирования можно не только добавлять обратный слэш к экранируемому символу, но и заключать часть текста в кавычки: "{{примечания}}" вместо \{\{примечания\}\}.


При этом большинство функций PCRE недоступно, в частности:
  • Все специальные символы нуждаются в экранировании (.?*+\/|[](){}<>"@#~, а также - внутри []) — даже там, где из контекста понятно, что это часть текста.
  • Доступны только следующие экранированные коды:
CirrusSearch Описание
\r возврат каретки
\n перевод строки
\t горизонтальная табуляция
\uHHHH Может представлять любой символ Unicode. Необходимо указать ровно 4 шестнадцатеричных символа, представляющих кодовую точку. Суррогатные пары представлены двумя последовательностями подряд. Поиск половины суррогатной пары не даст результатов.
  • Доступны только следующие метасимволы символьных классов:
CirrusSearch Описание
\d Соответствует любой цифре. Эквивалентно [0-9].
\s Соответствует символу пробела и различным символам пробела Unicode. Эквивалентно [\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\w Соответствует любому буквенно-цифровому символу ASCII и символу подчёркивания. Эквивалентно [A-Za-z0-9_]


Последнее можно обходить заменой на наборы:
Примеры замен символьных классов
PCRE CirrusSearch Описание
\D [^\d] не цифра. Эквивалентно [^0-9]
\S [^\s] любой непробельный символ. Эквивалентно [^\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\W [^\w] любой символ, кроме буквенного или цифрового символа или знака подчёркивания. Эквивалентно [^A-Za-z0-9_]


Оптимизация запроса

Поиск по регулярным выражениям — процесс ресурсозатратный. За отведённые на поиск 20 секунд движок успевает обработать, в зависимости от сложности запроса, от нескольких десятков до нескольких сотен тысяч страниц; единовременный поиск по всем страницам — которых в русской Википедии миллионы — невозможен.

Поэтому при использовании регулярных выражений следует ограничивать область поиска дополнительными ключами: в случаях, когда запрос содержит несколько ключей, движок сначала примет во внимание менее ресурсозатратные (такие, как prefix: или intitle:), и только в последнюю очередь начнёт фильтровать результаты по регулярному выражению. Например, если вы хотите найти статьи, содержащие в коде ссылку [[США|американский]], используйте запрос insource:"США американский" insource:/\[\[США\|американский\]\]/: первый оператор сократит область поиска до около 20 тыс. статей, с которой движок регулярных выражений справится. Если вам нужно найти определённые включения шаблона, ограничьте область поиска через hastemplate:"название шаблона", а если вы работаете с определённой тематикой — добавьте в запрос incategory:"тематическая категория".

Если этого не хватило, можно разбить запрос на несколько. Например, если ваш запрос по hastemplate:"музыкальный альбом" (около 20 тыс. включений) падает по таймауту, вместо него можно сделать два запроса: insource:"рок" hastemplate:"музыкальный альбом" и -insource:"рок" hastemplate:"музыкальный альбом" (около 10 тыс. включений каждый).

Если желаемая область поиска слишком велика, рассмотрите возможность скачать дамп Википедии и проанализировать его локально на своём компьютере (например, с помощью AutoWikiBrowser, Tools Database Scanner). В случае возникновения трудностей можно обратиться к ботоводам.

Ссылки
Downgrade Counter