Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "RegExMatch() [v1.0.45+]", в содержании - "String Management" - "RegExMatch()", v1.0.48.03.

Ник переводчика: YMP.

Настоящее имя переводчика: Юрий Попов.

RegExMatch() [v1.0.45+]

Ищет в строке подстроки, соответствующие указанному шаблону (регулярному выражению).

FoundPos := RegExMatch(Haystack, NeedleRegEx [, UnquotedOutputVar = "", StartingPosition = 1])

Параметры

FoundPos RegExMatch() возвращает позицию самого первого вхождения NeedleRegEx в строке Haystack. Позиция 1 означает первый символ. Ноль возвращается, если совпадений не найдено. Если случается ошибка (например, синтаксическая в NeedleRegEx), возвращается пустая строка, и ErrorLevel вместо нуля принимает одно из значений, приведённых ниже.
Haystack Строка, в которой производится поиск.
NeedleRegEx Шаблон для поиска, который является Perl-совместимым регулярным выражением (PCRE). Опции шаблона (если есть) должны стоять в его начале и отделяться от него закрывающей круглой скобкой. Например, шаблон "i)abc.*123" включает опцию нечувствительности к регистру и будет искать строку "abc", за которой следуют ноль или больше любых символов, за которыми следует строка "123". Если опций нет, скобка необязательна; например, ")abc" эквивалентно "abc".
UnquotedOutputVar Режим 1 (по умолчанию): имя переменной (без кавычек), в которую будет сохранена часть Haystack, которая соответствует всему шаблону. Если таковой не найдено (т.е. функция вернула 0), эта переменная и все элементы массива, описанные ниже, будут пустыми.

Если NeedleRegEx содержит захватывающие подшаблоны, их совпадения сохраняются в массиве, чьё базовое имя то же, что и у OutputVar. Например, если её имя Match, подстрока, найденная первым подшаблоном, сохранится в переменную Match1, вторым - в Match2 и т.д. Исключением из этого правила являются именованные подшаблоны: у них вместо порядкового номера добавляется имя. Например, подстрока, отвечающая именованному шаблону (?P<Year>\d{4}), будет сохранена в переменную MatchYear. Если какой-то конкретный подшаблон ни с чем не совпадёт (или если функция вернёт 0), соответствующая переменная будет пустой.

Внутри функции, чтобы создать массив, который будет глобальным, а не локальным, объявите базовое имя массива (например, Match) как глобальную переменную, перед тем как использовать его. Обратное верно для глобальных по умолчанию функций.

Режим 2 (позиция и длина): Если в опциях регулярного выражения присутствует буква P - например, "P)abc.*123", - в OutputVar будет сохранена длина строки, совпадающей со всем шаблоном (или 0 при отсутствии совпадений). Если имеются захватывающие подшаблоны, их длины и позиции сохраняются в двух массивах: OutputVarPos и OutputVarLen. Например, если базовое имя задано как Match, позиция совпадения для первого подшаблона будет сохранена в MatchPos1, а его длина - в MatchLen1 (в обоих местах будут нули, если совпадений нет или функция вернула 0). Исключением являются именованные подшаблоны, у которых вместо номера добавляется имя (например, MatchPosYear и MatchLenYear).
StartingPosition Позиция начала поиска. Если опущена, принимает значение 1 (начало Haystack). Иначе задайте 2, чтобы искать со второго символа, 3 - с третьего и т.д. Если StartingPosition превышает длину Haystack, поиск стартует с пустой строки, лежащей в конце Haystack (что, как правило, приводит к неудаче поиска).

Если StartingPosition меньше 1, она считается смещением (влево) от конца Haystack. Например, 0 означает старт с последнего символа, а -1 с предпоследнего. Если смещение выходит за начало Haystack, поиск проводится по всей строке.

Независимо от значения StartingPosition, возвращаемое значение всегда относительно к первому символу Haystack. Например, позиция "abc" в "123abc789" всегда будет 4.

ErrorLevel

Принимает одно из следующих значений:

Опции (чувствительны к регистру)

Опции ставятся в самом начале регулярного выражения и отделяются от остальной части закрывающей круглой скобкой. Например, шаблон "im)abc" будет искать строку abc с опциями нечувствительности к регистру и многострочности (скобку можно опускать, если опций нет). Хотя этот синтаксис нарушает традицию, он не требует специальных знаков-разделителей (таких как правая наклонная черта) и поэтому нет нужды экранировать такие разделители внутри шаблона. Кроме того, повышается производительность, поскольку упрощается разбор опций.

i Поиск без учёта регистра, т.е. буквы A-Z считаются идентичными a-z. (Прим. переводчика: для русских букв эта опция не действует.)
m Многострочность. Рассматривает Haystack как коллекцию отдельных строчек (если там имеются символы новой строки), а не как одну сплошную строку. Конкретно это меняет следующее:

1) Каретка (^) теперь означает как начало текста, так и начало каждой его строчки - место сразу после символов новой строки (за исключением случая, когда сразу после этих символов текст кончается).

2) Знак доллара ($) теперь обозначает как конец текста, так и конец каждой его строчки, т.е. место непосредственно перед символами новой строки.

Например, шаблон "m)^abc$" находит соответствие в "xyz`r`nabc" исключительно благодаря опции "m".

Опция "D" игнорируется, если есть опция "m".
s Заставляет точку (.) соответствовать всем символам, включая символы новой строки (обычно она им не соответствует). Однако, когда новая строка используется в варианте по умолчанию CRLF (`r`n), для её обозначения требуется две точки, а не одна. Независимо от этой опции, отрицательный набор символов, такой как [^a], всегда соответствует новой строке.
x Игнорирует пробельные символы в шаблоне, кроме случаев, когда они экранированы или внутри набора символов. Символы `n и `t относятся к игнорируемым, поскольку к моменту, когда они передаются PCRE, они уже являются литеральными пробельными символами (напротив, \n и \t не игнорируются, потому что являются escape-последовательностями PCRE). Опция x также игнорирует символы между неэкранированным знаком # вне символьного набора и следующей новой строкой включительно. Это даёт возможность вставлять комментарии в сложные шаблоны. Однако это относится только к видимым символам; пробельные могут никогда не появиться внутри последовательностей специальных символов, таких как (?(, которые начинают условный подшаблон.
A Привязывает шаблон к началу Haystack. В большинстве случаев это эквивалентно использованию якоря "^" в самом шаблоне.
D Заставляет знак доллара ($) совпадать самым концом Haystack, даже если в конце стоит новая строка. Без этой опции $ соответствует месту непосредственно перед последней новой строкой (если таковая есть). Замечание: эта опция игнорируется при наличии опции "m".
J Разрешает одинаковые именованные подшаблоны. Это может быть полезно в случаях, когда совпасть может только один из набора подшаблонов с одинаковыми именами. Замечание: в случае, если совпадений больше одного, сохраняется только самое левое. Кроме того, имена переменных нечувствительны к регистру.
U Отключает "жадность". Заставляет числители *+{} включать только такое количество символов, которое абсолютно необходимо для совпадения, не больше. Когда опция U не задана, конкретный числитель можно сделать нежадным, если поставить после него знак вопроса. И наоборот, если действует опция U, вопросительный знак после числителя сделает его жадным.
X PCRE_EXTRA. Включает возможности PCRE, несовместимые с Perl. На данный момент единственной такой возможностью является то, что наличие в шаблоне левой наклонной черты, за которой идёт символ, не имеющий специального значения, приводит к неудаче поиска и к соответствующей установке ErrorLevel. Эта опция помогает зарезервировать неиспользуемые последовательности с левой наклонной чертой для будущего использования. Без этой опции экранированные символы, не имеющие специального значения, воспринимаются как литералы (например, \g и g оба распознаются как литеральное g). Независимо от этой опции, неалфавитные символы после левой наклонной черты, не имеющие специального значения, всегда воспринимаются как литеральные (например, \/ и / оба означают правую наклонную черту).
P Позиционный режим. Заставляет RegExMatch() находить позиции и длины подстрок, совпадающих с шаблоном и подшаблонами, а не сами подстроки. Подробнее смотрите в описании OutputVar выше.
S Изучает шаблон в попытке улучшить его производительность. Это полезно, когда какой-то шаблон (особенно сложный) будет использован много раз. Если PCRE находит способ улучшить производительность, улучшенный вариант сохраняется в кэше для последующих применений этого шаблона (при последующих использованиях этого шаблона нужно также указывать опцию S, потому что нахождение варианта в кэше требует полного совпадения опций шаблона, включая их порядок).
`n Переключение с новой строки по умолчанию (`r`n) на одиночный символ перевода строки (`n), что является стандартом для систем UNIX. Выбранный символ для новой строки влияет на работу якорей (^ и $) и точки.
`r Переключение с новой строки по умолчанию (`r`n) на одиночный символ возврата каретки (`r).
`a С версии 1.0.46.06 `a обозначает любой тип новой строки, а именно: `r, `n, `r`n, `v/VT/vertical tab/chr(0xB), `f/FF/formfeed/chr(0xC) и NEL/next-line/chr(0x85). С версии 1.0.47.05 новая строка может быть ограничена только CR, LF и CRLF путём указания (*ANYCRLF) в верхнем регистре в начале шаблона (после опций); например, im)(*ANYCRLF)^abc$.

Замечание: для отделения одной опции от другой можно использовать пробелы и табуляции.

Производительность

Для поиска простых подстрок используйте функцию InStr(), поскольку она быстрее, чем RegExMatch().

Для улучшения производительности 100 последних использованных регулярных выражений хранятся в кэше в памяти (в компилированном виде).

Опция изучения (S) может иногда улучшить производительность регулярного выражения, которое используется много раз (например, в цикле).

Примечания

Подшаблону можно дать имя, такое как Year в шаблоне (?P<Year>\d{4}). Такие имена могут включать до 32 алфавитно-цифровых символов и подчёркиваний. Хотя именованные подшаблоны также доступны по своим номерам во время выполнения поиска (например, как обратные ссылки), они сохраняются в выходной массив только под именами (не под номерами). Например, если Year является первым подшаблоном, в OutputVarYear будет сохранена совпавшая подстрока, но OutputVar1 не будет изменена (в ней останется прежнее содержимое, если таковое было). Однако, если после "Year" совпадёт безымянный подшаблон, он будет сохранён в OutputVar2, а не в OutputVar1.

Большинство символов, таких как abc123, могут использоваться внутри регулярных выражений буквально. Однако символам \ . * ? + [ { | ( ) ^ $ должна предшествовать левая наклонная черта, чтобы они воспринимались как литеральные. Например, \. - это литеральная точка, а \\ - литеральная левая наклонная. Экранирования можно избежать, если использовать \Q...\E. Например: \QЛитеральный текст\E.

Внутри регулярного выражения специальные символы, такие как табуляция и новая строка, могут экранироваться либо акцентом (`), либо левой наклонной чертой (\). Например, `t - то же самое, что \t.

Основы синтаксиса регулярных выражений описаны в статье Регулярные выражения (RegEx) - краткий справочник

В AutoHotkey регулярные выражения реализованы с использованием Perl-совместимых регулярных выражений (PCRE) с www.pcre.org.

Примеры

FoundPos := RegExMatch("xxxabc123xyz", "abc.*xyz")  ; Возвращает 4, т.е позицию совпавшей подстроки.
FoundPos := RegExMatch("abc123123", "123$")  ; Возвращает 7, поскольку $ требует совпадения в конце.
FoundPos := RegExMatch("abc123", "i)^ABC")  ; Возвращает 1, поскольку действует опция нечувствительности к регистру.
FoundPos := RegExMatch("abcXYZ123", "abc(.*)123", SubPat)  ; Возвращает 1 и сохраняет "XYZ" в SubPat1.
FoundPos := RegExMatch("abc123abc456", "abc\d+", "", 2)  ; Возвращает 7, а не 1, так как StartingPosition
                                                         ; задана как 2, а не 1.

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.