SRE : Флаги

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



Существует 5 флагов в StringRegExp и каждый имеет свои особенности


Флаг 0

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

If StringRegExp('D:\file.txt', '\.\w+$') Then MsgBox(0, 'Сообщение', 'Да, файл имеет расширение')



Флаг 1

Общность флага 1 и 2 заключается в том, что они выполняют поиск до первого совпадения, но в отличии от флага 0 возвращают результат найденного. Может создаться впечатление, что эти два флага почти бесполезны, ведь чаще требуется возвращать все найденные совпадения, а не только первый. Но это обманчивое впечатление, так как функция StringRegExp имеет параметр offset (позиция, от которой начинается поиск) и возвращаемое значение @extended (позиция конца поиска, а точнее позиция следующего символа после конца поиска) для использования в цикле. Если вызывать функцию StringRegExp в цикле и использовать @extended в качестве значения параметра offset для следующего шага поиска, то данная конструкция выполнит те же действия, что и при использовании флагов 3 и 4. Но в данной конструкции вы получаете позиции найденных строк используя @extended, сделав вычитание длины шаблона @extended - StringLen($aRes[0]) получаем начальную позицию шаблона и т.д. Флаги 3 и 4 не позволяют этого сделать, они просто возвращают массив всех совпадений. Если в шаблоне отсутствуют группы, то возвращается массив с одним элементом, в котором весь найденный шаблон, иначе возвращается многоэлементный массив, размер которого равен числу групп в шаблоне.

$offset = 1
Do
    $aRes = StringRegExp('ab12cd34if56', '[a-z]+\d+', 1, $offset)
    If @error Then ExitLoop
    $offset = @extended
    MsgBox(0, 'Сообщение', 'Найдено = ' & $aRes[0] & @LF & _
            'Позиция начала = ' & $offset - StringLen($aRes[0]) & @LF & _
            'Позиция конца = ' & $offset - 1)
Until 0


Пример показывает, что при использовании групп возвращается массив групп.

#include <Array.au3>
$aRes = StringRegExp('12cd34if56', '([a-z])[a-z](\d)(\d)', 1)
If @error Then Exit
_ArrayDisplay($aRes, 'Array')



Флаг 2

Флаг 2 отличается от флага 1 тем, что возвращаемый массив всегда содержит в первом элементе массива $array[0] всю найденную по шаблону строку. Флаг 2 также как и флаг 1 ищет до первого совпадения, но возвращает массив, размер которого равен количеству групп используемых в шаблоне плюс 1. В первом элементе $array[0] - вся найденная по шаблону строка, а в оставшихся элементах массива содержимое групп. С помощью длины групп можно определить позиции каждой группы, если, конечно, они примыкают друг ко другу в шаблоне.

Флаг 3

Общность флага 3 и 4 заключается в том, что они возвращают все найденные вхождения в тексте. Флаг 3 наиболее популярный, возвращает обычный массив всех найденных вхождений.

Флаг 4

Возвращает массив массивов. Если флаг 3 содержит в каждом элементе массива найденную строку и её можно тут же использовать, то с флагом 4 каждый элемент содержит указатель на массив, если вы попытаетесь его сразу использовать, например вывести значение в консоль, то оно равно 0. Сначала нужно приравнять элемент массива какой-нибудь переменной, и только после этого использовать элемент массива для последующей обработки.
Пример

$aRes = StringRegExp('ab12cd34if56', '([a-z]+)(\d+)', 4)
If @error Then Exit MsgBox(0, 'Ошибка', 'Завершение скрипта')
$aArray = $aRes[1] ; приравнивание массива в переменную
MsgBox(0, 'Сообщение', $aArray[0])


Проверка ошибок

При использовании флага 1-4 обязательно требуется проверка на ошибку: проверить значение @error. Если не придавать этому значения, то впоследствии ошибка даст о себе знать. Переменная, в которую возвращается результат является массивом, а при ошибке (если ничего не найдено) она является числом Int32, в этом случае обращение к переменной как к массиву (к элементу массива) вызывает ошибку.

$aRes = StringRegExp('a', '\d', 2)
MsgBox(0, 'Сообщение', VarGetType($aRes))
MsgBox(0, 'Сообщение', $aRes[0]) ; пример ошибки