- Вывод текста
- Программирование
- Оформление
- Расширенные возможности
- Нюансы написания игр под разные плееры
-
- 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.$ в названии массива можно опустить).[#начало] может отсутствовать, при этом он принимается равным 0.
!Поиск строки 'This' среди элементов массива "$A"
ARRCOMP('$A','This',0)
!'Поиск строки, соответствующей регулярному выражению "abc\d+"
(первые два элемента массива игнорируются)'
ARRCOMP('$A','abc\d+',2)
!'аналогично предыдущему примеру, но поиск осуществляется
по всем элементам массива'
ARRCOMP('$A','.*string.*',0)
ARRCOMP('$A','This') &! эквивалентно 1му варианту
Почитайте наш самоучитель по составлению регулярных выражений:
На канале, посвящённом написанию игр на 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{имя свойства} ОтрицаниеВозможные названия свойств:
\n, где n - номер группы
Вперёд: Условия