- Вывод текста
- Программирование
- Оформление
- Расширенные возможности
- Нюансы написания игр под разные плееры
-
- x AeroQSP
- Утилиты и средства разработки
Этот раздел может на первый взгляд показаться сложным.
На самом деле в регулярных выражениях ничего особо сложного нет. То, что вам кажется непонятной абракадаброй, при должной сноровке легко читается. Тем не менее данный раздел можно спокойно пропустить, и вернуться к его изучению позже.
Регулярные выражения — это просто шаблоны, которые используются различными функциями для поиска в тексте фрагментов, точное значение которых неизвестно. Например, регулярное выражение позволяет отыскать в тексте слово из шести букв, оканчивающееся на "ка". Это может быть и слово "аптека", и слово "оптика", и слово "спичка", и слово "опушка". Регулярные выражения ещё называют регулярками, масками и регэкспами.
Сами по себе регулярные выражения ничего делать не умеют. Как мы уже выяснили, это просто шаблоны для строк. Но эти шаблоны вы можете использовать в специальных функциях.
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
! пытаемся отыскать числа в строке без чисел 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.SCANSTR [$имя_массива], [$текст_для_разбора], [$регэксп], [#номер_группы]
— оператор ищет в строке [$текст_для_разбора]
непересекающиеся фрагменты, соответствующие регулярному выражению [$регэксп]
, и помещает их в массив [$имя_массива]
. Если параметр [#номер_группы]
указан и отличается от нуля, в массив помещается не весь фрагмент целиком, а лишь та его часть, которая соответствует группе с указанным номером.Почитайте наш самоучитель по составлению регулярных выражений:
На канале, посвящённом написанию игр на 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
Также поддерживаются обратные ссылки: \G
, где G
- номер группы