Существует 5 флагов в StringRegExp и каждый имеет свои особенности
Флаг 0
Применяется для проверки вхождения шаблона в тексте. Поиск выполняется от начала до первого совпадения или до конца текста, если вхождение не будет найдено. Этот флаг по умолчанию, поэтому его можно даже не указывать
IfStringRegExp('D:\file.txt','\.\w+$')ThenMsgBox(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@errorThen ExitLoop $offset=@extended MsgBox(0,'Сообщение','Найдено = '&$aRes[0] &@LF& _ 'Позиция начала = '&$offset-StringLen($aRes[0]) &@LF& _ 'Позиция конца = '&$offset-1) Until0
Пример показывает, что при использовании групп возвращается массив групп.
Флаг 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@errorThen ExitMsgBox(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]); пример ошибки