Крылатые выражения
- 1 year ago
- 0
- 0
Внутренний поиск MediaWiki
поддерживает фильтр по
регулярным выражениям
. Поскольку текстовый поиск (включая поиск по исходному коду
insource:
) игнорирует знаки препинания, а буквы приводит в единый регистр, регулярные выражения — это единственный способ искать точную подстроку с учётом регистра.
Синтаксис ключа:
insource:/
регулярное выражение
/
Памятка:
Регулярные выражения — формальный язык, используемый в задачах на поиск и замену подстроки в тексте. Поскольку поиск MediaWiki накладывает свои ограничения, некоторые из которых контринтуитивны, данная справочная страница подразумевает, что вы уже знакомы с регулярными выражениями и умеете ими пользоваться. Тем не менее, краткая шпаргалка по синтаксису регулярных выражений может быть полезна:
АК2
в тексте «Kaganer принимал участие в АК1,
АК2
, АК4, АК5, АК7,
АК2
8 и
АК2
9» найдёт три вхождения (выделены зелёным).
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,}
):
lo*l
найдёт «ll», «lol», «lool», и так далее.
{1,}
):
lo+l
найдёт «lol», «lool», «loool», и так далее.
ха(-ха)+
найдёт подстроки «ха-ха», «ха-ха-ха», «ха-ха-ха-ха», и так далее.
co[dvw]er
может быть переписано в виде
coder|cover|cower
, либо в виде
co(d|v|w)er
.
{{примечания|2}}
, будет выглядеть следующим образом:
\{\{примечания\|2\}\}
. Если вы не уверены, какие символы являются управляющими, вы можете добавлять «\» к любому символу, кроме букв и цифр.
В основе регулярных выражений движка 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). В случае возникновения трудностей можно обратиться к ботоводам .