Поиск с помощью регулярных выражений

Регулярные выражения используются для осуществления поиска строк в тексте. По сути, регулярное выражение – это строка-образец (или шаблон, маска), состоящая из символов и знаков, и задающая правило поиска. Распространенными знаками регулярных выражений являются знаки «?» и «*», которые используются для представления одиночных символов или групп символов.

Регулярные выражения можно использовать только в поле «Искать». В поле «Заменить» регулярные выражения не распознаются, и введенные данные всегда воспринимаются как обычный текст. Далее перечислены основные виды регулярных выражений, которые могут быть использованы при поиске в «Конфигураторе».

Escape-знак «\» (одиночная обратная косая черта) – это знак, который указывает на то, что следующий за ним знак не является оператором. Например, звездочка (*) интерпретируется как знак, замещающий любую группу символов, а звездочка, перед которой стоит знак обратной косой черты (\*) – как знак «*» внутри текста. Примеры escape-знаков приведены в нижеследующей таблице. В таблице в столбце «Описание» для некоторых знаков приведены кодовые значения символов в международной кодировке Unicode (формат кодов UTF-16).


Таблица. Примеры использования escape-знаков


Escape-знак

Описание

Обычные знаки

Все знаки, кроме «.», «$», «^», «{», «[», «(», «|», «)», «*», «+», «?» и «\» соответствуют сами себе.

\t

Соответствует знаку табуляции \u0009.

\r

Соответствует знаку возврата каретки \u000D.

\n

Соответствует знаку новой строки \u000A.

\040

Соответствует знаку ASCII как восьмеричному числу (до трех разрядов). Например, знак \040 соответствует пробелу.

\x20

Соответствует знаку ASCII в шестнадцатеричном представлении (строго две цифры).

\cC

Соответствует управляющему знаку ASCII. Например, \cC – «Ctrl + C».

\u0020

Соответствует знаку Юникода в шестнадцатеричном представлении (строго четыре цифры).

\

Со следующим знаком, который не распознается как escape-знак, соответствует этому знаку. Например, выражение \* совпадает с выражением \x2A.


Примеры:

1. Если в строке поиска задано выражение «а\tб», то будет найдена следующая строка:  

«а        б» (Т.е. строка, в которой между символами «а» и «б» стоит знак табуляции).

1. Если в строке поиска задано выражение «Тогда\r», то будут найдена следующая строка: 

«Тогда

»

(Т.е. строка, в которой после слова «Тогда» стоит возврат каретки).

2. Если в строке поиска задано выражение «\u0028смещение\u0029», то будет найдена строка «(смещение)». Т.е. найдена строка, в которой слово «смещение» заключено в круглые скобки. «u0028» – код знака открывающей скобки, а «u0029» – закрывающей скобки.

Класс знаков представляет собой набор знаков, который можно сопоставить с искомой строкой. Буквенные знаки, escape-знаки и классы знаков можно объединять для создания шаблона регулярного выражения. Описание и синтаксис классов знаков приведены в нижеследующей таблице.


Таблица. Классы знаков и их синтаксис


Класс знаков

Описание

[группа_знаков]

Группа положительных знаков. Группа знаков состоит из одного или нескольких буквенных знаков, escape-знаков, диапазонов знаков или сцепленных классов знаков.

Например, чтобы указать все гласные, можно использовать код [aeiou]. Чтобы указать все знаки препинания и десятичные числа используется [\p{P}\d].

[^группа знаков]

Группа отрицательных знаков. Группа знаков состоит из одного или нескольких буквенных знаков, escape-знаков, диапазонов знаков или сцепленных классов знаков. Начальный знак (^) является обязательным и указывает на то, что группа знаков представляет собой группу отрицательных знаков, а не положительных.

Например, чтобы указать все знаки, кроме гласных, используется код [^aeiou]. Чтобы задать все знаки, кроме знаков препинания и десятичных чисел, используйте [^\p{P}\d].

[первыйЗнак-последнийЗнак]

Диапазон знаков. Диапазон знаков – это непрерывная последовательность знаков, которая задается указанием первого и последнего знака в последовательности и дефиса между ними. Два знака являются непрерывными, если они имеют соседние кодовые точки в Юникоде. Два или более диапазона знаков могут быть сцеплены.

Например, чтобы задать диапазон десятичных цифр от «0» до «9», диапазон строчных букв от «a» до «f» и диапазон прописных букв от «A» до «F» используйте [0-9a-fA-F].

.

Точка. Соответствует любому знаку, кроме \n. Точка в положительной или отрицательной группе знаков (знак в квадратных скобках) рассматривается как изменяемый буквенный знак, а не как класс знаков.

\p{имя}

Соответствует всем знакам в общей категории Юникода или в именованном блоке, указанном в параметре «Имя».

\P{имя}

Соответствует всем знакам, отсутствующим в общей категории Юникода или в именованном блоке, указанном в параметре «Имя».

\w

Соответствует любому алфавитно-цифровому знаку. Эквивалентно [a-zA-Z_0-9].

\W

Соответствует любому знаку, не являющемуся цифрой или буквой. Эквивалентно [^a-zA-Z_0-9].

\s

Соответствует любому знаку пробела.

\S

Соответствует любому знаку, не являющемуся пробелом.

\d

Соответствует любой десятичной цифре. Эквивалентно [0-9].

\D

Соответствует любому знаку, не являющемуся цифрой. Эквивалентно [^0-9].


Примеры:

1. Если в строке поиска задано выражение «([абв])», то будут найдены следующие строки: «(а)», «(б)», «(в)». (Т.е. строки, в которых символ «а», «б» или «в» заключен в скобки). 

2. Если в строке поиска задано выражение «\Wсмещение\W», то в строке «СпрОС.УстановитьСмещение(смещение);» будет найдена строка: «(смещение)». А в строке « смещение=0;» будет найдена строка: «_смещение=». (Т.е. слово «смещение», перед которым и после которого стоят знаки, не являющиеся цифрой или буквой). 

3. Если в строке поиска задано выражение «возврат \d», то будут найдены следующие строки: «возврат 0», «возврат 6». Т.е. строки, в которых после слова «возврат » стоит цифра. 


Служебные символы, описанные в следующей таблице, указывают, считается ли найденное соответствие действительным или недействительным, в зависимости от его текущего положения в строке. Например, знак (^) означает текущее положение в начале строки или текста. Таким образом, регулярное выражение ^FTP возвращает только те последовательности знаков «FTP», которые встречаются в начале строки.


Таблица. Знаки, указывающие на положение совпадения в строке


Знак

Описание

^

Указывает, что совпадение должно находиться в начале текста или строки.

$

Указывает, что совпадение должно находиться в конце строкового значения, перед \n в конце строки или в конце текста.

\A

Указывает, что соответствие должно находиться в начале строки

\Z

Указывает, что соответствие должно находиться в конце строки или перед \n в конце строки

\z

Указывает, что соответствие должно находиться в конце строки

\G

Указывает, что соответствие должно находиться в той точке, где заканчивается предыдущее соответствие.

\b

Указывает, что соответствие должно находиться на границе между знаками \w (алфавитно-цифровыми) и \W (не алфавитно-цифровыми). Эти соответствия должны быть на границах слов (то есть на первом и последнем знаках в словах, разделенных знаками, не являющимися буквами или цифрами). Соответствие может также находиться на границе слова в конце строки.

\B

Указывает, что соответствие не должно находиться на границе \b.


Примеры:

1. Если в строке поиска задано выражение «\Aзапись», то в строках:  

«запись = Новый("ДанныеТаблСтроки");»;

«запись.УстановитьТипЯчейки("строка").» будут найдены слова »запись». (В перечисленных строках слова «запись» находятся в начале строки)

2. Если в строке поиска задано выражение «\bСписок », то в строке «Для каждого ТекОС из ОССписок Цикл» будет найдена строка «Список». Слово «Список» находится между алфавитными символами и не алфавитными, т.е. в строке перед словом стоят буквы, а после – пробел).

3. Если в строке поиска задано выражение «\BЦикл», то в строке «КонецЦикла» будет найдена строка: «Цикл». Слово «Цикл» в строке находится между алфавитными символами. 


Специальный знак «|» изменяет регулярное выражение так, что оно может сопоставляться по принципу «или-или». Знак «|» означает, что искомая строка соответствует любому из элементов, разделенных «|» (вертикальной чертой). Например, ftp|http|www. В первую очередь проверяется на соответствие крайнее слева слово.