Внутренний поиск 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, но есть и различия:
- Оператор точка
.
находит любые символы, включая перевод строки. - Нет операторов
^
(начало строки) и$
(конец строки). - Поддерживаются «ленивые» операторы (например,
.*?
). - Добавлен оператор
<>
для поиска по диапазону чисел, например:<1997-2006> год в компьютерных играх
- Для нечувствительности к регистру можно дописать
i
после закрывающего слэша:insource:/регулярное выражение/i
. - Для экранирования можно не только добавлять обратный слэш к экранируемому символу, но и заключать часть текста в кавычки:
"{{примечания}}"
вместо\{\{примечания\}\}
.
При этом большинство функций PCRE недоступно, в частности:
- Все специальные символы нуждаются в экранировании (
.?*+\/|[](){}<>"@#~
, а также-
внутри[]
) — даже там, где из контекста понятно, что это часть текста. - Нельзя использовать символьные классы, такие как
\n
(перенос строки),\s
(пробельный символ) или\d
(цифра).
Последнее можно обходить заменой на наборы:
PCRE | MediaWiki | Описание |
---|---|---|
\d |
[0-9] |
цифра |
\D |
[^0-9] |
не цифра |
\n |
[^ -] |
перевод строки (также может найти символ табуляции) |
[^\n\t] |
[ -] |
любой символ, кроме перевода строки и табуляции |
\s |
[^!-] |
пробельный символ (пробел, перевод строки или табуляция) |
\S |
[!-] |
любой непробельный символ (не пробел, не перевод строки и не табуляция) |
В диапазонах « » используется как первый символ, следующий за управляющими, «!» — как следующий за ним, а «» — как символ с достаточно большим кодом, чтобы все реально используемые в статьях символы располагались в кодовых таблицах раньше него. Таким образом, диапазон от « » до «» включает все символы, кроме управляющих (из которых в статьях могут встретиться перевод строки и табуляция), а диапазон от «!» до «» — все, кроме управляющих и пробела.
Оптимизация запроса
правитьПоиск по регулярным выражениям — процесс ресурсозатратный. За отведённые на поиск 20 секунд движок успевает обработать, в зависимости от сложности запроса, от нескольких десятков до нескольких сотен тысяч страниц; единовременный поиск по всем страницам — которых в русской Википедии миллионы — невозможен.
Поэтому при использовании регулярных выражений следует ограничивать область поиска дополнительными ключами: в случаях, когда запрос содержит несколько ключей, движок сначала примет во внимание менее ресурсозатратные (такие, как prefix:
или intitle:
), и только в последнюю очередь начнёт фильтровать результаты по регулярному выражению. Например, если вы хотите найти статьи, содержащие в коде ссылку [[США|американский]]
, используйте запрос insource:"США американский" insource:/\[\[США\|американский\]\]/
: первый оператор сократит область поиска до около 20 тыс. статей, с которой движок регулярных выражений справится. Если вам нужно найти определённые включения шаблона, ограничьте область поиска через hastemplate:"название шаблона"
, а если вы работаете с определённой тематикой — добавьте в запрос incategory:"тематическая категория"
.
Если этого не хватило, можно разбить запрос на несколько. Например, если ваш запрос по hastemplate:"музыкальный альбом"
(около 20 тыс. включений) падает по таймауту, вместо него можно сделать два запроса: insource:"рок" hastemplate:"музыкальный альбом"
и -insource:"рок" hastemplate:"музыкальный альбом"
(около 10 тыс. включений каждый).
Если желаемая область поиска слишком велика, рассмотрите возможность скачать дамп Википедии и проанализировать его локально на своём компьютере (например, с помощью AutoWikiBrowser, Tools → Database Scanner). В случае возникновения трудностей можно обратиться к ботоводам.