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

Регулярное выражение описывает шаблон, которому должна соответствовать искомая подстрока в строке символов.

Например, шаблон [0-9]?[0-9]:[0-9][0-9] предназначен для поиска времени в формате чч:мм или ч:мм:

Шаблон может состоять из произвольных юникодных символов, однако некоторые символы имеют специальное значение. Ниже приведена таблица специальных символов. Если вы хотите, чтобы при сравнении специальный символ учитывался как обычный символ, то необходимо поместить перед ним символ ‘\’. Если шаблон из предыдущего примера изменить на [0-9]\?[0-9]:[0-9][0-9], то результат сравнения будет следующим:

Таблица специальных символов 

Символ

Значение

.

Соответствует произвольному одиночному символу.

[ ]

Обозначает класс символов. В тексте может стоять любой символ из квадратных скобок (например, [abc] будет соответствовать "a", "b" или "c").

^

Если этот символ стоит в начале класса символов, то такой класс символов соответствует любому символу кроме символа из квадратных скобок (например, [^abc] соответствует всем символам кроме "a", "b" и "c").

Если ^ стоит в начале регулярного выражения, то найденная подстрока должна начинаться с первой позиции текста (например, ^[abc] соответствует строке, начинающейся с символов "a", "b" или "c").

-

В классе символов обозначает диапазон символов (например, [0-9] соответствует любой цифре от "0" до "9").

?

Обозначает, что предыдущее выражение может отсутвовать вообще или встречаться один раз (например, [0-9][0-9]? соответствует "2" и "12").

+

Обозначает, что предыдущее выражение может встречаться один или более число раз (например, [0-9]+ соответствует "1", "13", "777" и т.д.).

*

Обозначает, что предыдущее выражение может встречаться ноль или более число раз.

??, +?, *?

Добавление вопросительного знака изменяет алгоритм поиска для символов ?, + и *. Алгоритм “искать как можно больше” меняется на алгоритм “искать как можно меньше”. Например: для входной строки "<abc><def>", <.*?> соответствует "<abc>", а <.*> соответствует "<abc><def>".

( )

Оператор объединения в группу. Например: (\d+,)*\d+ соответствует списку чисел через запятую ("1" или "1,23,456").

{ }

Оператор объединения в группу для последующей ссылки. См. также пояснение к символу ‘\’

\

Этот символ отменяет специальное значение следующего за ним символа (например, [0-9]+ соответствует одной или более цифрам, но [0-9]\+ соответствует одной цифре, за которой следует плюс). Кроме этого, символ используется для аббревиатур (см. далее).

Если за символом ‘\’ следует цифра n, то это обозначает ссылку на n-ю группу в фигурных скобках (начиная с 0). Например: <{.*?}>.*?</\0> соответствует "<head>Contents</head>". 

$

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

|

Оператор выбора: разделяет два выражения, одно из которых должно найтись в тексте (например, T|the соответствует "The" или "the").

!

Оператор отрицания: выражение следующее за ! не должно встретиться в тексте. Пример: a!b соответствует "a", за которым не следует "b".

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

Аббревиатуры 

Аббревиатура

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

\a

Любой символ латинского алфавита или цифра : ([a-zA-Z0-9])

\b

Пробельный символ

\c

Любой символ латинского алфавита: ([a-zA-Z])

\d

Цифра: ([0-9])

\h

Цифра в шестнадцатеричной нотации: ([0-9a-fA-F])

\n

Символ новой строки

\q

Строка в кавычках: (\"[^\"]*\")|(\'[^\']*\')

\w

Слово из латинский букв: ([a-zA-Z]+)

\z

Целое число: ([0-9]+)

\t

Символ табуляции

Применение

В настоящий момент регулярные выражения используются для:

Правила сегментации

Для того, чтобы полностью определить правило сегментации (или исключение из правила), необходимо задать 3 части правила: строку до разделителя, разделитель, строку после разделителя. Если правило сегментации задается с помощью регулярного выражения, то разделителем считается первый символ в фигурных скобках, строкой до разделителя – то, что стоит перед фигурными скобками, а строкой после разделителя – то, что стоит после фигурных скобок. Пример:

Допустим мы хотим, чтобы двоеточие в данном примере не являлось границей сегмента. Можно составить следующее простое исключение:

Строка до разделителя  14
Разделитель   :
Строка после разделителя  06

Однако что делать, если в тексте встретится другое время? Составлять еще одно исключение? Вместо этого можно написать исключение на основе регулярного выражения:

 \d+{:}\d+

Запрос к базе Translation Memory

Регулярное выражение может быть задано как в поле оригинала, так и в поле перевода запроса. При выполнении запроса ищется соответствие регулярного выражения тексту оригинала и/или перевода сегмента для каждой записи. Записи, в которых совпадение было найдено, представляются как результат запроса.