Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
help:regexp [2023/01/01 17:06] aleks_versus |
help:regexp [2024/10/14 11:12] (текущий) aleks_versus обновление 5.9.0 |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | |||
[[help:strings|Назад: Строки]] | [[help:strings|Назад: Строки]] | ||
====== Регулярные выражения ====== | ====== Регулярные выражения ====== | ||
- | |||
Этот раздел может на первый взгляд показаться сложным. | Этот раздел может на первый взгляд показаться сложным. | ||
Строка 15: | Строка 13: | ||
===== Функции, использующие регулярные выражения ===== | ===== Функции, использующие регулярные выражения ===== | ||
- | * ''**STRCOMP(**[$строка]**,**[$шаблон]**)**'' - проводит сравнение строки ''[$строка]'' на соответствие регулярному выражению ''[$шаблон]''. Возвращает 1, если строка соответствует шаблону, иначе **0**. Сравни с функцией ''$STRFIND''.<sxh qsp> | + | * ''%%STRCOMP([$строка],[$шаблон])%%'' - проводит сравнение строки ''%%[$строка]%%'' на соответствие регулярному выражению ''%%[$шаблон]%%''. Возвращает ''%%1%%'', если строка соответствует шаблону, иначе ''%%0%%''. Сравни с функцией ''%%$STRFIND%%''. <sxh qsp> |
- | strcomp('иду по дороге','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 1 | + | strcomp('иду по дороге','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 1 |
- | strcomp(' иду домой','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 0 | + | strcomp(' иду домой','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 0 |
- | strcomp(' иду в лес ','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 1 | + | strcomp(' иду в лес ','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 1 |
- | strcomp('однословие','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 0 | + | strcomp('однословие','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 0 |
</sxh> | </sxh> | ||
- | * ''**$STRFIND(**[$строка]**,**[$шаблон]**,**[#номер]**)**'' - эта функция ищет в строке ''[$строка]'' подстроку, соответствующую регулярному выражению ''[$шаблон]'', и возвращает эту подстроку.<sxh qsp> | + | * ''%%$STRFIND([$строка],[$шаблон],[#номер])%%'' - эта функция ищет в строке ''%%[$строка]%%'' подстроку, соответствующую регулярному выражению ''%%[$шаблон]%%'', и возвращает эту подстроку. <sxh qsp> |
- | ! функция найдёт слово из четырёх букв | + | ! функция найдёт слово из четырёх букв |
- | $STRFIND('идти к пещере', '\b\w{4}\b') &! на экране увидим 'идти' | + | $STRFIND('идти к пещере', '\b\w{4}\b') &! на экране увидим 'идти' |
</sxh> | </sxh> | ||
- | * Если указан ''[#номер]'', то функция возвращает не всю найденную подстроку, а только ту её часть которая соответствует группе с указанным номером ''[#номер]''. Группы нумеруются слева направо, сначала внешние, а потом внутренние, начиная с **1**.<sxh qsp> | + | * Если указан ''%%[#номер]%%'', то функция возвращает не всю найденную подстроку, а только ту её часть которая соответствует группе с указанным номером ''%%[#номер]%%''. Группы нумеруются слева направо, сначала внешние, а потом внутренние, начиная с **1**. <sxh qsp> |
- | ! первая группа в первых скобках, вторая во вторых, третья - в скобках, вложенных во вторые | + | ! первая группа в первых скобках, вторая во вторых, третья - в скобках, вложенных во вторые |
- | $STRFIND('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',1) &! на экране увидим '671' | + | $STRFIND('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',1) &! на экране увидим '671' |
- | $STRFIND('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',2) &! на экране увидим '-190-23-999' | + | $STRFIND('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',2) &! на экране увидим '-190-23-999' |
- | $STRFIND('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',3) &! на экране увидим '-999' | + | $STRFIND('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',3) &! на экране увидим '-999' |
</sxh> | </sxh> | ||
- | * Если подстрока с указанным номером отсутствует, то возвращается пустая строка.<sxh qsp> | + | * Если подстрока с указанным номером отсутствует, то возвращается пустая строка. <sxh qsp> |
- | ! пытаемся отыскать числа в строке без чисел | + | ! пытаемся отыскать числа в строке без чисел |
- | $STRFIND('Восемь зелёных яблок в корзине','\d+') &! на экране будет пустая строка | + | $STRFIND('Восемь зелёных яблок в корзине','\d+') &! на экране будет пустая строка |
</sxh> | </sxh> | ||
- | * Ещё примеры:<sxh qsp> | + | * Ещё примеры: <sxh qsp> |
- | $STRFIND('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 0) &! 'идти к пещере' | + | $STRFIND('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 0) &! 'идти к пещере' |
- | $STRFIND(' идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 0) &! '' | + | $STRFIND(' идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 0) &! '' |
- | $STRFIND('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 1) &! 'идти' | + | $STRFIND('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 1) &! 'идти' |
- | $STRFIND('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 2) &! 'к' | + | $STRFIND('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 2) &! 'к' |
- | $STRFIND('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 3) &! 'пещере' | + | $STRFIND('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 3) &! 'пещере' |
- | $STRFIND('идти к дому', 'к\s(\S+)', 0) &! 'к дому' | + | $STRFIND('идти к дому', 'к\s(\S+)', 0) &! 'к дому' |
- | $STRFIND('идти к дому', 'к\s(\S+)') &! 'к дому' | + | $STRFIND('идти к дому', 'к\s(\S+)') &! 'к дому' |
- | $STRFIND('идти к дому', 'к\s(\S+)', 1) &! 'дому' | + | $STRFIND('идти к дому', 'к\s(\S+)', 1) &! 'дому' |
- | $STRFIND('идти к своему дому', 'к\s(\S+)', 1) &! 'своему' | + | $STRFIND('идти к своему дому', 'к\s(\S+)', 1) &! 'своему' |
</sxh> | </sxh> | ||
- | * ''**STRPOS(**[$строка]**,**[$шаблон]**,**[#номер]**)**'' - эта функция похожа на функцию ''**$STRFIND**'', то есть она ищет в строке ''[$строка]'' подстроку, соответствующую регулярному выражению ''[$шаблон]''. Однако, в отличие от функции ''**$STRFIND**'', она возвращает номер символа, с которого начинается вхождение найденной подстроки в указанную строку ''[$строка]''.<sxh qsp> | + | * ''%%STRPOS([$строка],[$шаблон],[#номер])%%'' - эта функция похожа на функцию ''%%$STRFIND%%'', то есть она ищет в строке ''%%[$строка]%%'' подстроку, соответствующую регулярному выражению ''%%[$шаблон]%%''. Однако, в отличие от функции ''%%$STRFIND%%'', она возвращает номер символа, с которого начинается вхождение найденной подстроки в указанную строку ''%%[$строка]%%''. <sxh qsp> |
- | ! функция найдёт слово из трёх букв, и вернёт номер первого символа, | + | ! функция найдёт слово из трёх букв, и вернёт номер первого символа, |
- | ! с которого это слово начинается | + | ! с которого это слово начинается |
- | STRPOS('Здесь три слова.', '\b\w{3}\b') &! на экране увидим 7 | + | STRPOS('Здесь три слова.', '\b\w{3}\b') &! на экране увидим 7 |
</sxh> | </sxh> | ||
- | * Если указан ''[#номер]'', то функция возвращает номер символа, с которого начинается вхождение не всей подстроки, а только той её части, которая соответствует группе с указанным номером ''[#номер]''. Группы нумеруются слева направо, сначала внешние, а потом внутренние, начиная с **1**.<sxh qsp> | + | * Если указан ''%%[#номер]%%'', то функция возвращает номер символа, с которого начинается вхождение не всей подстроки, а только той её части, которая соответствует группе с указанным номером ''%%[#номер]%%''. Группы нумеруются слева направо, сначала внешние, а потом внутренние, начиная с **1**. <sxh qsp> |
- | !------'----5--8------15--' | + | !------'----5--8------15--' |
- | STRPOS('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',1) &! на экране увидим 5 | + | STRPOS('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',1) &! на экране увидим 5 |
- | STRPOS('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',2) &! на экране увидим 8 | + | STRPOS('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',2) &! на экране увидим 8 |
- | STRPOS('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',3) &! на экране увидим 15 | + | STRPOS('+33-671-190-23-999', '\+\d{1,2}-(\d{3})((-\d+)+)',3) &! на экране увидим 15 |
</sxh> | </sxh> | ||
- | * Если подстрока с указанным номером отсутствует, то возвращается **0**.<sxh qsp> | + | * Если подстрока с указанным номером отсутствует, то возвращается **0**. <sxh qsp> |
- | ! пытаемся отыскать числа в строке без чисел | + | ! пытаемся отыскать числа в строке без чисел |
- | STRPOS('Восемь зелёных яблок в корзине','\d+') &! на экране будет 0 | + | STRPOS('Восемь зелёных яблок в корзине','\d+') &! на экране будет 0 |
</sxh> | </sxh> | ||
- | * Ещё примеры:<sxh qsp> | + | * Ещё примеры: <sxh qsp> |
- | STRPOS('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 0) &! 1 | + | STRPOS('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 0) &! 1 |
- | STRPOS(' идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 0) &! 0 | + | STRPOS(' идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 0) &! 0 |
- | STRPOS('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 1) &! 1 | + | STRPOS('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 1) &! 1 |
- | STRPOS('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 2) &! 6 | + | STRPOS('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 2) &! 6 |
- | STRPOS('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 3) &! 8 | + | STRPOS('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 3) &! 8 |
- | STRPOS('идти к пещере', '^(\S+)\s(\S+)(\s(\S+))?$', 4) &! 8 | + | STRPOS('идти к пещере', '^(\S+)\s(\S+)(\s(\S+))?$', 4) &! 8 |
- | STRPOS('идти к дому', 'к\s(\S+)', 0) &! 6 | + | STRPOS('идти к дому', 'к\s(\S+)', 0) &! 6 |
- | STRPOS('идти к дому', 'к\s(\S+)') &! 6 | + | STRPOS('идти к дому', 'к\s(\S+)') &! 6 |
- | STRPOS('идти к дому', 'к\s(\S+)', 1) &! 8 | + | STRPOS('идти к дому', 'к\s(\S+)', 1) &! 8 |
- | STRPOS('идти к своему дому', 'к\s(\S+)', 1) &! 8 | + | STRPOS('идти к своему дому', 'к\s(\S+)', 1) &! 8 |
</sxh> | </sxh> | ||
- | * ''**ARRCOMP**([$имя_массива],[$шаблон],[#начало])'' - возвращает номер элемента массива ''[$имя_массива]'', соответствующего регулярному выражению ''[$шаблон]''. Поиск начинается с элемента с номером ''[#начало]''; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает **-1**. | + | * ''%%ARRCOMP([$имя_массива],[$шаблон],[#начало])%%'' - возвращает номер элемента массива ''%%[$имя_массива]%%'', соответствующего регулярному выражению ''%%[$шаблон]%%''. Поиск начинается с элемента с номером ''%%[#начало]%%''; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает **-1**. |
- | * Поиск работает только по текстовым элементам массива (символ ''$'' в названии массива можно опустить). | + | * Подробное описание функции с примерами в разделе "[[help:arrays|Массивы]]". |
- | * Параметр ''[#начало]'' может отсутствовать, при этом он принимается равным **0**. | + | |
- | * Примеры:<sxh qsp> | + | ===== Операторы, использующие регулярные выражения ===== |
- | !Поиск строки 'This' среди элементов массива "$A" | + | |
- | ARRCOMP('$A','This',0) | + | * ''%%SCANSTR [$имя_массива], [$текст_для_разбора], [$регэксп], [#номер_группы]%%'' — оператор ищет в строке ''%%[$текст_для_разбора]%%'' непересекающиеся фрагменты, соответствующие регулярному выражению ''%%[$регэксп]%%'', и помещает их в массив ''%%[$имя_массива]%%''. Если параметр ''%%[#номер_группы]%%'' указан и отличается от нуля, в массив помещается не весь фрагмент целиком, а лишь та его часть, которая соответствует группе с указанным номером. |
- | !'Поиск строки, соответствующей регулярному выражению "abc\d+" | + | * Подробное описание оператора и примеры использования в разделе "[[help:arrays|массивы]]". |
- | (первые два элемента массива игнорируются)' | + | |
- | ARRCOMP('$A','abc\d+',2) | + | |
- | !'аналогично предыдущему примеру, но поиск осуществляется | + | |
- | по всем элементам массива' | + | |
- | ARRCOMP('$A','.*string.*',0) | + | |
- | ARRCOMP('$A','This') &! эквивалентно 1му варианту | + | |
- | </sxh> | + | |
- | * Функция возвращает только числовой индекс элемента. Строковый или многомерный индекс с помощью данной функции получить нельзя. | + | |
===== Как научиться писать регулярные выражения ===== | ===== Как научиться писать регулярные выражения ===== | ||
Строка 93: | Строка 83: | ||
Почитайте наш самоучитель по составлению регулярных выражений: | Почитайте наш самоучитель по составлению регулярных выражений: | ||
- | * [[regex:start|Самоучитель по регулярным выражениям]] | + | * [[regex:start|Самоучитель по регулярным выражениям]] |
На канале, посвящённом написанию игр на QSP, есть отдельное видео по регуляркам: | На канале, посвящённом написанию игр на QSP, есть отдельное видео по регуляркам: | ||
- | * [[https://youtu.be/2ERAQw1M-yA|Уроки по QSP. Номер 23. Регулярные выражения]] | + | * [[https://youtu.be/2ERAQw1M-yA|Уроки по QSP. Номер 23. Регулярные выражения]] |
Ещё есть прекрасное видео на канале Алекса Лущенко: | Ещё есть прекрасное видео на канале Алекса Лущенко: | ||
- | * [[https://youtu.be/_pLpx6btq6U|Не бойтесь регулярных выражений. Regex за 20 минут!]] | + | * [[https://youtu.be/_pLpx6btq6U|Не бойтесь регулярных выражений. Regex за 20 минут!]] |
Полезные сайты: | Полезные сайты: | ||
- | * [[https://regexcrossword.com/|https://regexcrossword.com/]] | + | * [[https://regexcrossword.com|Игровое обучение регуляркам - regexcrossword.com]] |
- | * [[https://regex101.com/|https://regex101.com/]] | + | * [[https://regex101.com/|Тестирование регулярок онлайн - regex101.com]] |
- | * [[https://regexper.com|https://regexper.com]] | + | * [[https://regexper.com|Вводим свою регулярку и получаем объяснение - regexper.com]] |
- | * [[https://regexone.com|https://regexone.com]] | + | * [[https://regexone.com|Обучающий материал на английском - regexone.com]] |
===== Основные элементы синтаксиса регулярок в QSP ===== | ===== Основные элементы синтаксиса регулярок в QSP ===== | ||
Строка 116: | Строка 106: | ||
==== Метасимволы ==== | ==== Метасимволы ==== | ||
- | * ''**\**'' — Экранирующий символ. | + | * ''%%\%%'' — Экранирующий символ. |
- | * ''**|**'' — Выбор из альтернатив "или|или" | + | * ''%%|%%'' — Выбор из альтернатив "или|или" |
- | * ''**()**'' — Группировка, т.е. задание групп | + | * ''%%()%%'' — Группировка, т.е. задание групп |
- | * ''**[]**'' — объединение символов в класс, например чётные цифры "[02468]". Такое объединение считается за один символ. | + | * ''%%[]%%'' — объединение символов в класс, например чётные цифры "[02468]". Такое объединение считается за один символ. |
==== Фиксаторы ==== | ==== Фиксаторы ==== | ||
- | * ''**^**'' — Начало строки | + | * ''%%^%%'' — Начало строки |
- | * ''**$**'' — Конец строки | + | * ''%%$%%'' — Конец строки |
- | * ''**\b**'' — Граница слова | + | * ''%%\b%%'' — Граница слова |
- | * ''**\B**'' — Не граница слова | + | * ''%%\B%%'' — Не граница слова |
==== Квантификаторы ==== | ==== Квантификаторы ==== | ||
- | * ''*****'' — 0 или более вхождений символа или группы. | + | * ''%%*%%'' — 0 или более вхождений символа или группы. |
- | * ''**+**'' — 1 или более вхождений символа или группы. | + | * ''%%+%%'' — 1 или более вхождений символа или группы. |
- | * ''**?**'' — 0 или 1 вхождение символа или группы. | + | * ''%%?%%'' — 0 или 1 вхождение символа или группы. |
- | * ''**{n}**'' — Ровно n вхождений символа или группы. | + | * ''%%{n}%%'' — Ровно n вхождений символа или группы. |
- | * ''**{n,}**'' — От n вхождений, и более, символа или группы | + | * ''%%{n,}%%'' — От n вхождений, и более, символа или группы |
- | * ''**{,m}**'' — От 0 до m вхождений символа или группы | + | * ''%%{,m}%%'' — От 0 до m вхождений символа или группы |
- | * ''**{n,m}**'' — От n до m вхождений символа или группы | + | * ''%%{n,m}%%'' — От n до m вхождений символа или группы |
- | + | * ''%%*?%%'' — "Ленивое" ''%%*%%'' | |
- | * ''***?**'' — "Ленивое" ''*****'' | + | * ''%%+?%%'' — "Ленивое" ''%%+%%'' |
- | * ''**+?**'' — "Ленивое" ''**+**'' | + | * ''%%??%%'' — "Ленивое" ''%%?%%'' |
- | * ''**??**'' — "Ленивое" ''**?**'' | + | * ''%%{n}?%%'' — "Ленивое" ''%%{n}%%'' |
- | * ''**{n}?**'' — "Ленивое" ''**{n}**'' | + | * ''%%{n,}?%%'' — "Ленивое" ''%%{n,}%%'' |
- | * ''**{n,}?**'' — "Ленивое" ''**{n,}**'' | + | * ''%%{,m}?%%'' — "Ленивое" ''%%{,m}%%'' |
- | * ''**{,m}?**'' — "Ленивое" ''**{,m}**'' | + | * ''%%{n,m}?%%'' — "Ленивое" ''%%{n,m}%%'' |
- | * ''**{n,m}?**'' — "Ленивое" ''**{n,m}**'' | + | |
==== Спецсимволы ==== | ==== Спецсимволы ==== | ||
- | * ''**\t**'' — Табуляция | + | * ''%%\t%%'' — Табуляция |
- | * ''**\n**'' — Перевод строки | + | * ''%%\n%%'' — Перевод строки |
- | * ''**\r**'' — Возврат каретки | + | * ''%%\r%%'' — Возврат каретки |
==== Спецсимволы предопределенных классов символов ==== | ==== Спецсимволы предопределенных классов символов ==== | ||
- | * ''**.**'' — Любой символ | + | * ''%%.%%'' — Любой символ |
- | * ''**\w**'' — Буква, цифры или символ подчёркивания | + | * ''%%\w%%'' — Буква, цифра или символ подчёркивания |
- | * ''**\W**'' — Не входит в ''**\w**'', т.е. не буква, не цифра и не символ подчёркивания | + | * ''%%\W%%'' — Не входит в ''%%\w%%'', т.е. не буква, не цифра и не символ подчёркивания |
- | * ''**\s**'' — Пробельный символ | + | * ''%%\s%%'' — Пробельный символ |
- | * ''**\S**'' — Не пробельный символ | + | * ''%%\S%%'' — Не пробельный символ |
- | * ''**\d**'' — Цифра | + | * ''%%\d%%'' — Цифра |
- | * ''**\D**'' — Не цифра | + | * ''%%\D%%'' — Не цифра |
- | * ''**\h**'' — Шестнадцатиричная цифра | + | * ''%%\h%%'' — Шестнадцатиричная цифра (''%%[ABCDEFabcdef0123456789]%%'') |
- | * ''**\H**'' — Не входит в **\h**, т.е. не шестнадцатеричная цифра | + | * ''%%\H%%'' — Не входит в **\h**, т.е. не шестнадцатеричная цифра |
==== Свойства символов ==== | ==== Свойства символов ==== | ||
- | * ''**\p{имя свойства}**'' Свойство | + | * ''%%\p{имя свойства}%%'' Свойство |
- | * ''**\p{^имя свойства}**'' Отрицание | + | * ''%%\p{^имя свойства}%%'' Отрицание |
- | * ''**\P{имя свойства}**'' Отрицание | + | * ''%%\P{имя свойства}%%'' Отрицание |
Возможные названия свойств: | Возможные названия свойств: | ||
- | **Alnum, Alpha, Blank, Cntrl, Digit, Graph, Lower, Print, Punct, Space, Upper, XDigit, Word, ASCII** | ||
- | Также поддерживаются обратные ссылки: ''**\n**'', где ''n'' - номер группы | + | **Alnum, Alpha, Blank, Cntrl, Digit, Graph, Lower, Print, Punct, Space, Upper, XDigit, Word, ASCII** |
- | [[help:conditional|Вперёд: Условия]] | + | Также поддерживаются обратные ссылки: ''%%\G%%'', где ''%%G%%'' - номер группы |
+ | [[help:tuples|Вперёд: Кортежи]] | ||