StringRegExp
Ищет в строке совпадения с образцом, заданным в виде регулярного выражения.
StringRegExp ( "test", "pattern" [, flag = 0 [, offset = 1 ]] )
Параметры
test | Строка для поиска. |
pattern |
Образец для поиска (шаблон). |
flag |
[необязательный] Флаг, определяющий поведение функции. См. ниже. По умолчанию равен 0. |
offset |
[необязательный] Позиция строки, начиная с которой будут искаться совпадения (нумерация начинается с 1). По умолчанию равен 1. |
flag | Поведение |
0 |
Возвращает 1 (совпадение найдено) или 0 (не найдено). |
1 |
Поиск до первого совпадения; возвращает массив групп, а при отсутствии групп одноэлементный массив с полным совпадением шаблона (см. примечания). |
2 |
Поиск до первого совпадения; возвращает массив содержащий в первом элементе полное совпадение с шаблоном, последующие элементы - совпадение указанных групп (стиль Perl / PHP). |
3 |
Возвращает массив всех полных совпадений с шаблоном. |
4 |
Возвращает массив массивов всех совпадений; каждый массив содержит в первом элементе полное совпадение с шаблоном, последующие элементы - совпадение указанных групп (стиль Perl / PHP). |
Возвращаемое значение
если flag = 0, то @error принимает следующие значения:2 | Неправильный шаблон. @extended содержит позицию ошибочного символа в регулярном выражении. |
0 | Возвращает массив. @extended содержит позицию, в которой закончился поиск, чтобы использовать для дальнейшего поиска. |
1 | Нет совпадений. Возвращаемое значение - не массив. |
2 | Неправильный шаблон, возвращаемое значение - не массив. @extended содержит позицию ошибочного символа в регулярном выражении. |
0 | Возвращает массив совпадений. |
1 | Нет совпадений. Возвращаемое значение - не массив. |
2 | Неправильный шаблон, возвращаемое значение - не массив. @extended содержит позицию ошибочного символа в регулярном выражении. |
Примечания
Параметр flag может принимать пять значений (от 0 до 4). При flag = 0, функция возвращает 1 (найдено) или 0 (не найдено). Если флаг равен 1 или 2, то функция находит первое совпадение и возвращает его в виде массива. Если флаг равен 3 или 4, то функция находит все возможные совпадения и возвращает их в массиве. Если флаг равен 2 или 4, то возвращаемые массивы содержат полное совпадение с шаблоном и совпадения групп, а не только полное совпадение, как при использовании флага 1 или 3.( ) | начало и конец группы, например (text). Означают последовательность. Используются для применения квантификаторов не к одному символу, а к нескольким, а также для дальнейшего использования найденной последовательности. |
[ ] |
начало и конец описания символьного класса, например [a-z]. Символьный класс возвращает один символ из множества. Изменить это могут повторители. |
{ } |
начало и конец повторителей, например {3,8} |
\ |
экранирующий символ, принять метасимвол как обычный символ, например (\\, \., \[, \], \{, \}, \*). |
^ |
начало строки (или начало текста в многострочных текстах), например ^text text$ |
$ |
конец строки (или конец текста в многострочных текстах), например ^text text$ |
. |
любой символ, кроме переноса строки @LF (по умолчанию). С флагом (?s) - любой символ |
| |
символ "или", обычно внутри группы, например (10|20) |
? |
предыдущий символ либо имеется, либо не имеется, аналогично и для групп. После символа повтора - жадность паттерна - (.*?) |
* |
повтор предыдущего символа или группы 0 и более раз |
+ |
повтор предыдущего символа или группы 1 и более раз |
\ | экранирующий символ |
^ |
символ исключения, но в случае, когда стоит первым, например [^3] все кроме три |
- |
символ охвата, например [a-z], то есть любой из символов от a до z |
[ ] |
начало и конец описания символьного класса, например [a-z] |
\1 - \9 | ссылка на найденную группу в самом шаблоне и в шаблоне замены |
$1 - $9 |
ссылка на найденную группу в шаблоне замены (9 не ограничение) |
$0 или \0 |
весь шаблон поиска |
\a |
Chr(7) - символ с десятичным ASCII-кодом 7 (звонок). При выводе воспроизводит звуковой сигнал. BEL (hex 07) |
\cn |
управляющий символ, который генерируется при нажатии комбинации клавиш Ctrl+n, где n- символ, например \cD соответствует Ctrl+D. \cA = \001, \cZ = \032, \cM = \r = \015 |
\e |
Chr(27) - символ escape (hex 1B) |
\f |
Chr(12) перенос страницы (hex 0C) |
\h |
[ \t] любой горизонтальный пробел, табуляция - Chr(9), Chr(32), Chr(160) |
\H |
[^\h] - любой символ, который не пробел или табуляция |
\K |
reset start of match. |
\n |
@LF, Chr(10) - символ переноса на новую строку (hex 0A) |
\N |
[^\n] Любой символ, который не символ переноса на новую строку (не @LF). Не работает в 3.3.6.1 |
\Q ... \E |
любые метасимволы между \Q и \E воспринимаются как текст. Не исключайте ошибки: \QD:\Edit\1.txt\E |
\r |
@CR, Chr(13) - символ возврат каретки (hex 0D) |
\R |
[\n\f\r\v] Chr(10), Chr(11), Chr(12), Chr(13) любой из символов переноса строки |
\t |
@TAB, Chr(9) символ табуляции - tab (hex 09) |
\v |
[\r\n\f] Chr(10), Chr(11), Chr(12), Chr(13) вертикальная табуляция (@CR и @LF и перенос страницы) |
\V |
[^\v] - любой символ, который не Chr(10), Chr(11), Chr(12), Chr(13) вертикальная табуляция (перенос строки) |
\x** |
где * - любая шестнадцатеричная цифра, например \x41 соответствует латинской букве 'A', \x50\x65\x72\x6C - слово Perl |
\x{**..} |
где * - любая шестнадцатеричным цифра, например \x{50}\x{65}\x{72}\x{6C} - слово Perl. Попробуйте от \x{01} до \x{7F}, что в десятеричной системе означает символы от 1 до 127. Или в UTF кодировке \x{044F} равный символу "я" |
\*** |
где * - любая восьмеричная цифра. Например, последовательность \120\145\162\154 представляет слово Perl (\120 - восьмеричный код буквы Р, \145 - буквы е, \162 - буквы r, \154 - буквы l). Пробел - \040. Попробуйте от \001 до \177, что в десятеричной системе означает символы от 1 до 127 |
\G |
обозначает точку, в которой закончился предыдущий поиск (first matching position in subject) |
\d | [0-9] - любая десятичная цифра |
\D |
[^0-9] любая не цифра |
\s |
[\f\n\r\t\v ] - пустой символ: Chr(9), Chr(10), Chr(12), Chr(13), Chr(32) (перенос страницы, табуляция, возврат каретки, перевод строки и пробел). |
\S |
[^\f\n\r\t\v ] - любой непробельный символ |
\w |
[0-9a-zA-Z_] - любой алфавитно-числовой символ или подчеркивание (только символы латинского алфавита) |
\W |
[^0-9a-zA-Z_] - любой символ неслова |
\A | Начало текста, не зависит от флага "(?m)" и поэтому может встретится только 1 раз |
\z |
Исключительно конец текста, не зависит от флага "(?m)" и поэтому может встретится только 1 раз |
\Z |
Конец текста, т. е. граница между любым символом и концом текста или до символа \n, если он в конце строки, не зависит от флага "(?m)" и поэтому может встретится только 1 раз. |
\b |
начало или конец слова, т. е. граница между символами, один из которых удовлетворяет \W, а другой - удовлетворяет \w (только границы слов латинского алфавита) |
\B |
Середина слова, т. е. граница между символами, оба которых удовлетворяют \W или оба которых удовлетворяют \w |
(?i) | не учитывать регистр символов. Это работает только для символов латинского алфавита. |
(?-i) |
отменяет ранее включенный (?i) |
(?m) |
в многострочном тексте символы ^ и $ означают начало и конец строки соответственно, иначе начало и конец текста |
(?-m) |
отменяет ранее включенный (?m) |
(?s) |
символ "точка" (.) дополнительно включает в себя перенос строки @LF (режим "одна строка") |
(?-s) |
отменяет ранее включенный (?s) |
(?x) |
игнорирует пробелы и табуляции в регулярном выражении, кроме тех что в квадратных скобках. Пробелы позволяют сделать регулярное выражение легко читаемым. Позволяет в конце рег. выр. добавить комментарий после символа # и до конца строки |
(?-x) |
отменяет ранее включенный (?x) |
(?J) |
allow duplicate names (разрешает дубликаты/двойные названия). |
(?U) |
инвертировать жадность квантификаторов |
(?-U) |
отменяет ранее включенный (?U) |
(?i:...) | группа не учитывает регистр символов, например (?i:Text) |
(?-i:...) | группа учитывает регистр символов, например (?-i:Text) |
(?:...) | исключает группу из найденных, например (?:Text) |
(?>...) | группа не входящая в поиск, но имеет свойство сверхжадного квантификатора, например (?>Text)(Text) |
(?=...) | группа не входящая в поиск, но проверяющая совпадение образца справа, например (Text)(?=Text) |
(?!...) | группа не входящая в поиск, но проверяющая не совпадение образца справа, например (Text)(?!Text) |
(?<=...) | группа не входящая в поиск, но проверяющая совпадение образца слева, например (?<=Text)(Text) |
(?<!...) | группа не входящая в поиск, но проверяющая не совпадение образца слева, например (?<!Text)(Text) |
(?<name>...) | именованная ссылка. Вызов именованной ссылки \k<name> это тоже что вызов \1 или $1 |
(?#...) |
группа содержащая комментарий, например (?# это комментарий ). Полностью игнорируется интерпретатором |
{n} | повторить предыдущий символ n раз |
{n,} |
повторить предыдущий символ n и более раз ( {n,}? - предпочтительно наименьший захват) |
{n, m} |
повторить предыдущий символ от n до m раз ( {n,m}? - предпочтительно наименьший захват) |
* |
повторить предыдущий символ 0 и более раз. То же что и {0,}. Жадный захват, наибольший, который позволит совпасть оставшейся части шаблона. |
+ |
повторить предыдущий символ 1 и более раз. То же что и {1,}. Жадный захват, наибольший, который позволит совпасть оставшейся части шаблона. |
? |
предыдущий символ либо имеется, либо не имеется. То же что и {0, 1}. Второе значение символа ? после символа повтора .*? - жадность, см. ниже |
*? |
повторить предыдущий символ 0 и более раз. Ограничится наименьшим захватом (не жадный), который позволит совпасть оставшейся части шаблона. |
+? |
повторить предыдущий символ 1 и более раз. Ограничится наименьшим захватом (не жадный), который позволит совпасть оставшейся части шаблона. |
?? |
предпочтительно наименьший захват, например ([a-z]??)g для 'gg' возвращает две пустые строки |
*+ | повторить предыдущий символ 0 и более раз. |
++ |
повторить предыдущий символ 1 и более раз. |
{n,}+ |
повторить предыдущий символ n и более раз. |
[:alnum:] | буквы и цифры [0-9A-Za-z] (как \w, но без "_") |
[:alpha:] |
буквы [A-Za-z] (без "_") |
[:ascii:] |
символы от Chr(0) до Chr(127) |
[:blank:] |
пробел и символ табуляции Chr(9) и Chr(32), тоже что [\t ] |
[:cntrl:] |
управляющие символы от Chr(0) до Chr(31) и Chr(127) |
[:digit:] |
десятичные цифры, тоже что \d, [0-9] |
[:graph:] |
тоже что символы, отображаемые при печати [:print:], но кроме пробела (от Chr(33) до Chr(126) ) |
[:lower:] |
прописные буквы [a-z] |
[:print:] |
символы, отображаемые при печати, включая пробел (от Chr(32) до Chr(126) ) |
[:punct:] |
символы, отображаемые при печати, кроме букв и цифр Chr=(33-47, 58-64, 91-96, 123-126), те, что не входят ни в [:alnum:], ни в [:cntrl:] |
[:space:] |
пробельные символы (как \s, но включая символ VT: Chr(11) ) от Chr(9) до Chr(13) и Chr(32). Тоже что [\f\n\r\t\v ] |
[:upper:] |
заглавные буквы [A-Z] |
[:word:] |
символы слов, тоже что \w |
[:xdigit:] |
шестнадцатеричные цифры [0-9A-Fa-f] |
(?(если)то) | например (?(?=[a-z])\d), (?(условие)шаблон_при_успехе) |
(?(если)то|иначе) |
например (?(?<=\d)a|b) или (?:(?>(?=[^a-z]*[a-z])())?(?:(?=\1)aa|(?!\1)1)), (?(условие)шаблон_при_успехе|шаблон_при_не_успехе) |
(?=[\w]+)| (?R) |
рекурсивный вызов |
\p | любой символ пунктуации |
\l |
означает, что следующий символ регулярного выражения преобразуется в нижний регистр. |
\u |
означает, что следующий символ регулярного выражения преобразуется в верхний регистр. |
\L...\Е |
означает, что все символы в регулярном выражении между \L и \Е преобразуются в нижний регистр. |
\U...\Е |
означает, что все символы в регулярном выражении между \U и \Е преобразуются в верхний регистр. |
\x |
любой шестнадцатеричный символ |
\< |
начало слова, т. е. граница между символом, удовлетворяющим \W и символом, удовлетворяющим \w |
\> |
конец слова, т. е. граница между символом, удовлетворяющим \w и символом, удовлетворяющим \W |
{,n} |
повторить предыдущий символ от 0 до n раз |
.* | повтор любого символа, а значит весь текст |
[ ... ] |
одиночный символ множества, например [aeiou] - любой из строчных гласных |
[^ ... ] |
ни один из символов множества, например [^aeiou] - ни один из строчных гласных |
[0-9A-Fa-f]{6} |
Шестнадцатеричное число, например FF0000. |
[А-яЁё] |
диапазон для русских букв. Или так [А-Яа-яЁё] |
Примеры |
---|
Найти (\r\n|\r|\n){2,} заменить на \1 - удаляет пустые строки |
Найти (?<![^\s\A])([А-яЁё]+)[\h]+\1 заменить на \1 - удаляет повторы слов |
Найти [A-ZА-ЯЁ]{2,}?[a-zа-яё]+ - выявляет файлы, в которых есть ошибки вида "НАйти"- не преднамеренный повтор заглавной буквы |
Найти (.{35,}?)\h заменить на '$1'&@CRLF - выполняет перенос строки на границе первого попавшегося пробела после каждых 35 символов. |
Найти (?si)(?:.*?)?(https?://[\w.:]+/?(?:[\w/?&=.~;\-+!*_#%])*) - найти ссылки |
Найти [A-Za-z0-9._-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}) - найти почтовые ящики |
См. также
StringRegExpReplace, StringInStrПример
#include <Array.au3> ; для использования _ArrayDisplay
; Тестовая строка
$sText = '<tage>Текст1</tage> <tage>Текст2</tage> <tage>Текст3</Tage>'
; флаг=0
If StringRegExp($sText, '\d') Then MsgBox(0, 'флаг=0', 'Да, строка содержит цифру')
; флаг=1, используется смещение для пошагового поиска всех элементов
$iOffset = 1
While 1
$aRes = StringRegExp($sText, '(?i)<tage>(.*?)</tage>', 1, $iOffset)
If @error Then ExitLoop ; Выход из цикла если более не найдено
$iOffset = @extended ; Сохраняет позицию, от которой начать следующий поиск
; Просмотр только одного элемента массива, так как в рег.выр. одна группа
MsgBox(0, 'флаг=1', 'Найдено = ' & $aRes[0] & @LF & _
'Позиция начала = ' & $iOffset - StringLen($aRes[0]) & @LF & _
'Позиция конца = ' & $iOffset - 1) ; Позиции могут использоваться другими строковыми функциями
WEnd
; флаг=2, используется смещение, возвращает весь шаблон и группы
$iOffset = 1
While 1
$aRes = StringRegExp($sText, '(?i)<tage>(.*?)</tage>', 2, $iOffset)
If @error Then ExitLoop
$iOffset = @extended
_ArrayDisplay($aRes, "флаг=2")
WEnd
; флаг=3, возвращает все найденные группы
$aRes = StringRegExp($sText, '(?i)<tage>(.*?)</tage>', 3)
If @error Then Exit ; Проверка ошибки ОБЯЗАТЕЛЬНА.
_ArrayDisplay($aRes, "флаг=3") ; функция для просмотра массива
; флаг=4, возвращает все группы в виде массива массивов
$aRes = StringRegExp($sText, '(?i)(<tage>)(.*?)(</tage>)', 4)
If @error Then Exit MsgBox(0, 'Ошибка', 'Завершение скрипта') ; Проверка ошибки избавляет от неуловимой ошибки
For $i = 0 To UBound($aRes) - 1
$aArray = $aRes[$i] ; приравнивание массива в переменную
_ArrayDisplay($aArray, "флаг=4") ; функция для просмотра массива
Next