Инструменты пользователя

Инструменты сайта


help:regexp

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

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**, где ​- номер группы+Также поддерживаются обратные ссылки: ​''​%%\G%%''​, где ​''​%%G%%'' ​- номер группы 
 + 
 +[[help:​tuples|Вперёд:​ Кортежи]]
  
----- 
-[[help:​conditional|Вперёд:​ Условия]] 
help/regexp.1428443654.txt.gz · Последние изменения: 2017/09/30 11:41 (внешнее изменение)