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