Меню
Главная
Случайная статья
Настройки
|
Внутренний поиск MediaWiki поддерживает фильтр по регулярным выражениям. Поскольку текстовый поиск (включая поиск по исходному коду insource: ) игнорирует знаки препинания, а буквы приводит в единый регистр, регулярные выражения — это единственный способ искать точную подстроку с учётом регистра.
Синтаксис ключа: insource:/регулярное выражение/
Памятка:
- Не забывайте экранировать все метасимволы, даже если это кажется вам избыточным (подробнее).
- Раскрывайте символьные классы (подробнее).
- Ограничивайте область поиска дополнительными ключами (подробнее).
Содержание
Краткая справка по регулярным выражениям
Регулярные выражения — формальный язык, используемый в задачах на поиск и замену подстроки в тексте. Поскольку поиск 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). В случае возникновения трудностей можно обратиться к ботоводам.
Ссылки
|
|