Регулярные выражения: различия между версиями
Patarakin (обсуждение | вклад) |
Patarakin (обсуждение | вклад) |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 7: | Строка 7: | ||
На практике процессор регулярных выражений выполняет поиск по шаблону не для одного фрагмента, а для множества фрагментов, которые составляют входящий текст. Разбиение на фрагменты большого текста, позволяет процессору регулярных выражений разумно расходовать ресурсы компьютера, так как текст может быть очень большим для обработки его целиком. Не вдаваясь в детали реализации, процессор мог бы разбивать большой текст на фрагменты ориентируясь на символ переноса строки. Таким образом, процессор строка за строкой пытается найти искомые результаты во фрагментах, причем каждый отдельный фрагмент это отдельная по времени вызываемая процедура, результат которой никак не оказывает влияния на предыдущие или последующие результаты. Понимание этого важно, когда вы столкнетесь с конкретными реализациями процессоров регулярных выражений. | На практике процессор регулярных выражений выполняет поиск по шаблону не для одного фрагмента, а для множества фрагментов, которые составляют входящий текст. Разбиение на фрагменты большого текста, позволяет процессору регулярных выражений разумно расходовать ресурсы компьютера, так как текст может быть очень большим для обработки его целиком. Не вдаваясь в детали реализации, процессор мог бы разбивать большой текст на фрагменты ориентируясь на символ переноса строки. Таким образом, процессор строка за строкой пытается найти искомые результаты во фрагментах, причем каждый отдельный фрагмент это отдельная по времени вызываемая процедура, результат которой никак не оказывает влияния на предыдущие или последующие результаты. Понимание этого важно, когда вы столкнетесь с конкретными реализациями процессоров регулярных выражений. | ||
== Особенности поиска MediaWiki == | |||
В основе регулярных выражений движка [[Lucene]], используемого в MediaWiki, лежат [[Регулярные выражения#Расширенные регулярные выражения POSIX|расширенные регулярные выражения POSIX]], но есть и различия: | |||
* Оператор точка <code>.</code> находит любые символы, включая перевод строки. | |||
* Нет операторов <code>^</code> (начало строки) и <code>$</code> (конец строки). | |||
* Поддерживаются «ленивые» операторы (например, <code>.*?</code>). | |||
* Добавлен оператор <code><nowiki><></nowiki></code> для поиска по диапазону чисел, например: <code><nowiki><1997-2006> год в компьютерных играх</nowiki></code> | |||
* Для нечувствительности к регистру можно дописать <code>i</code> после закрывающего слэша: <code>insource:/''регулярное выражение''/i</code>. | |||
* Для экранирования можно не только добавлять обратный слэш к экранируемому символу, но и заключать часть текста в кавычки: <code><nowiki>"{{примечания}}"</nowiki></code> вместо <code>\{\{примечания\}\}</code>. | |||
При этом большинство функций PCRE недоступно, в частности: | |||
* Все специальные символы нуждаются в экранировании (<code>.?*+\/|[](){}<>"@#~</code>, а также <code>-</code> внутри <code>[]</code>) — даже там, где из контекста понятно, что это часть текста. | |||
* Нельзя использовать символьные классы, такие как <code>\n</code> (перенос строки), <code>\s</code> (пробельный символ) или <code>\d</code> (цифра). | |||
Последнее можно обходить заменой на наборы: | |||
{|class="wikitable" | |||
|+ Примеры замен символьных классов | |||
!scope="col"| PCRE | |||
!scope="col"| MediaWiki | |||
!scope="col"| Описание | |||
|- | |||
| <code>\d</code> || <code>[0-9]</code> || цифра | |||
|- | |||
| <code>\D</code> || <code>[^0-9]</code> || не цифра | |||
|- | |||
| <code>\n</code> || <code>[^ -]</code> || перевод строки (также может найти символ [[Табуляция|табуляции]]) | |||
|- | |||
| <code>[^\n\t]</code> || <code>[ -]</code> || любой символ, кроме перевода строки и табуляции | |||
|- | |||
| <code>\s</code> || <code>[^!-]</code> || пробельный символ (пробел, перевод строки или табуляция) | |||
|- | |||
| <code>\S</code> || <code>[!-]</code> || любой непробельный символ (не пробел, не перевод строки и не табуляция) | |||
|} | |||
В диапазонах <nowiki>« »</nowiki> используется как первый символ, следующий за [[Управляющие символы|управляющими]], «!» — как следующий за ним, а «» — как символ с достаточно большим кодом, чтобы все реально используемые в статьях символы располагались в кодовых таблицах раньше него. Таким образом, диапазон от <nowiki>« »</nowiki> до «» включает все символы, кроме управляющих (из которых в статьях могут встретиться перевод строки и табуляция), а диапазон от «!» до «» — все, кроме управляющих и пробела. | |||
=== Расширенные регулярные выражения POSIX === | |||
Синтаксис в основном аналогичен традиционному. | |||
* Отменено использование обратной косой черты для метасимволов {{nobrc|<nowiki>{</nowiki> <nowiki>}</nowiki>}} и {{nobrc|<nowiki>(</nowiki> <nowiki>)</nowiki>}}. | |||
* Обратная косая черта перед метасимволом отменяет его специальное значение | |||
* Отвергнута теоретически '''нерегулярная''' конструкция {{nobrc|<nowiki>\</nowiki>''n''}}. | |||
* Добавлены метасимволы {{nobrc|<nowiki>+</nowiki>}}, {{nobrc|<nowiki>?</nowiki>}}, {{nobrc|<nowiki>|</nowiki>}}. |
Текущая версия на 20:48, 26 февраля 2024
Описание | Регуля́рные выраже́ния (англ. regular expressions, жарг. регэ́кспы или ре́гексы или регулярки) — система обработки текста, основанная на специальной системе записи шаблонов для поиска. |
---|---|
Область знаний | Информатика, Лингвистика, Большие данные |
Авторы | |
Поясняющее видео | |
Близкие понятия | |
Среды и средства для освоения понятия | Perl, PHP, Python, Notepad++ |
Сейчас регулярные выражения используются многими текстовыми редакторами и утилитами для поиска и изменения текста на основе выбранных правил. Многие языки программирования уже поддерживают регулярные выражения для работы со строками. Например, Perl и Tcl имеют встроенный в их синтаксис механизм обработки регулярных выражений. Набор утилит (включая редактор sed и фильтр grep), поставляемых в дистрибутивах Unix, одним из первых способствовал популяризации понятия регулярных выражений.
На практике процессор регулярных выражений выполняет поиск по шаблону не для одного фрагмента, а для множества фрагментов, которые составляют входящий текст. Разбиение на фрагменты большого текста, позволяет процессору регулярных выражений разумно расходовать ресурсы компьютера, так как текст может быть очень большим для обработки его целиком. Не вдаваясь в детали реализации, процессор мог бы разбивать большой текст на фрагменты ориентируясь на символ переноса строки. Таким образом, процессор строка за строкой пытается найти искомые результаты во фрагментах, причем каждый отдельный фрагмент это отдельная по времени вызываемая процедура, результат которой никак не оказывает влияния на предыдущие или последующие результаты. Понимание этого важно, когда вы столкнетесь с конкретными реализациями процессоров регулярных выражений.
Особенности поиска 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 |
[!-] |
любой непробельный символ (не пробел, не перевод строки и не табуляция) |
В диапазонах « » используется как первый символ, следующий за управляющими, «!» — как следующий за ним, а «» — как символ с достаточно большим кодом, чтобы все реально используемые в статьях символы располагались в кодовых таблицах раньше него. Таким образом, диапазон от « » до «» включает все символы, кроме управляющих (из которых в статьях могут встретиться перевод строки и табуляция), а диапазон от «!» до «» — все, кроме управляющих и пробела.
Расширенные регулярные выражения POSIX
Синтаксис в основном аналогичен традиционному.
- Отменено использование обратной косой черты для метасимволов Шаблон:Nobrc и Шаблон:Nobrc.
- Обратная косая черта перед метасимволом отменяет его специальное значение
- Отвергнута теоретически нерегулярная конструкция Шаблон:Nobrc.
- Добавлены метасимволы Шаблон:Nobrc, Шаблон:Nobrc, Шаблон:Nobrc.