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

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


Боковая панель

help:regexp

Это старая версия документа.


Назад: Строки

Регулярные выражения

Этот раздел может на первый взгляд показаться сложным.

На самом деле в регулярных выражениях ничего особо сложного нет. То, что вам кажется непонятной абракадаброй, при должной сноровке легко читается. Тем не менее данный раздел можно спокойно пропустить, и вернуться к его изучению позже.

Регулярные выражения — это просто шаблоны, которые используются различными функциями для поиска в тексте фрагментов, точное значение которых неизвестно. Например, регулярное выражение позволяет отыскать в тексте слово из шести букв, оканчивающееся на "ка". Это может быть и слово "аптека", и слово "оптика", и слово "спичка", и слово "опушка". Регулярные выражения ещё называют регулярками, масками и регэкспами.

Сами по себе регулярные выражения ничего делать не умеют. Как мы уже выяснили, это просто шаблоны для строк. Но эти шаблоны вы можете использовать в специальных функциях.

Функции, использующие регулярные выражения

  • STRCOMP([$строка],[$шаблон]) - проводит сравнение строки [$строка] на соответствие регулярному выражению [$шаблон]. Возвращает 1, если строка соответствует шаблону, иначе 0. Сравни с функцией $STRFIND.
    	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?') & ! вернёт 1
    	strcomp('однословие','\s?\S+\s+\S+\s+\S+\s?') & ! вернёт 0
    
  • $STRFIND([$строка],[$шаблон],[#номер]) - эта функция ищет в строке [$строка] подстроку, соответствующую регулярному выражению [$шаблон], и возвращает эту подстроку.
    		! функция найдёт слово из четырёх букв
    		$STRFIND('идти к пещере', '\b\w{4}\b') &! на экране увидим 'идти'
    
    • Если указан [#номер], то функция возвращает не всю найденную подстроку, а только ту её часть которая соответствует группе с указанным номером [#номер]. Группы нумеруются слева направо, сначала внешние, а потом внутренние, начиная с 1.
      		! первая группа в первых скобках, вторая во вторых, третья - в скобках, вложенных во вторые
      		$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'
      
    • Если подстрока с указанным номером отсутствует, то возвращается пустая строка.
      		! пытаемся отыскать числа в строке без чисел
      		$STRFIND('Восемь зелёных яблок в корзине','\d+') &! на экране будет пустая строка
      
    • Ещё примеры:
      		$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+)$', 2)  &! 'к'
      		$STRFIND('идти к пещере', '^(\S+)\s(\S+)\s(\S+)$', 3)  &! 'пещере'
      		$STRFIND('идти к дому', 'к\s(\S+)', 0) &! 'к дому' 
      		$STRFIND('идти к дому', 'к\s(\S+)')    &! 'к дому'
      		$STRFIND('идти к дому', 'к\s(\S+)', 1) &! 'дому'
      		$STRFIND('идти к своему дому', 'к\s(\S+)', 1) &! 'своему'
      
  • STRPOS([$строка],[$шаблон],[#номер]) - эта функция похожа на функцию $STRFIND, то есть она ищет в строке [$строка] подстроку, соответствующую регулярному выражению [$шаблон]. Однако, в отличие от функции $STRFIND, она возвращает номер символа, с которого начинается вхождение найденной подстроки в указанную строку [$строка].
    		! функция найдёт слово из трёх букв, и вернёт номер первого символа,
    		! с которого это слово начинается
    		STRPOS('Здесь три слова.', '\b\w{3}\b') &! на экране увидим 7
    
    • Если указан [#номер], то функция возвращает номер символа, с которого начинается вхождение не всей подстроки, а только той её части, которая соответствует группе с указанным номером [#номер]. Группы нумеруются слева направо, сначала внешние, а потом внутренние, начиная с 1.
      		!------'----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
      
    • Если подстрока с указанным номером отсутствует, то возвращается 0.
      		! пытаемся отыскать числа в строке без чисел
      		STRPOS('Восемь зелёных яблок в корзине','\d+') &! на экране будет 0
      
    • Ещё примеры:
      		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
      
  • ARRCOMP([$имя_массива],[$шаблон],[#начало]) - возвращает номер элемента массива [$имя_массива], соответствующего регулярному выражению [$шаблон]. Поиск начинается с элемента с номером [#начало]; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает -1.
    • Поиск работает только по текстовым элементам массива (символ $ в названии массива можно опустить).
    • Параметр [#начало] может отсутствовать, при этом он принимается равным 0.
    • Примеры:
      		!Поиск строки 'This' среди элементов массива "$A"
      		ARRCOMP('$A','This',0)
      		!'Поиск строки, соответствующей регулярному выражению "abc\d+"
      		(первые два элемента массива игнорируются)'
      		ARRCOMP('$A','abc\d+',2)
      		!'аналогично предыдущему примеру, но поиск осуществляется
      		по всем элементам массива'
      		ARRCOMP('$A','.*string.*',0) 
      		ARRCOMP('$A','This') &! эквивалентно 1му варианту
      
    • Функция возвращает только числовой индекс элемента. Строковый или многомерный индекс с помощью данной функции получить нельзя.

Как научиться писать регулярные выражения

Почитайте наш самоучитель по составлению регулярных выражений:

На канале, посвящённом написанию игр на QSP, есть отдельное видео по регуляркам:

Ещё есть прекрасное видео на канале Алекса Лущенко:

Полезные сайты:

Основные элементы синтаксиса регулярок в 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 — Шестнадцатиричная цифра
  • \H — Не входит в \h, т.е. не шестнадцатеричная цифра

Свойства символов

  • \p{имя свойства} Свойство
  • \p{^имя свойства} Отрицание
  • \P{имя свойства} Отрицание

Возможные названия свойств:

Alnum, Alpha, Blank, Cntrl, Digit, Graph, Lower, Print, Punct, Space, Upper, XDigit, Word, ASCII

Также поддерживаются обратные ссылки: \n, где n - номер группы

Вперёд: Условия

help/regexp.1672592833.txt.gz · Последние изменения: 2023/01/01 17:07 — aleks_versus