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

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

Например, шаблон [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".

Существуют предопределенные регулярные выражения, которые будем называть аббревиатурами (иногда их также называют эскейп-последовательностями от англ. escape sequences).

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

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

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

\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

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

Резервирование слов

Строка, заданная в поле Слово или словосочетание, при резервировании считается регулярным выражением только в том случае, когда перед ней стоит служебный символ [!]. Программа автоматически подставляет его, как только вы выбираете первый символ регулярного выражения из меню. Однако, если вы создаёте регулярное выражение без помощи программы, не забывайте самостоятельно ставить перед ним служебный символ [!].

Пример 1:

“Цена на две самые популярные марки бензина - А-92 и А-95 - продолжает расти”

Допустим, мы хотим зарезервировать в этом предложении марки бензина А-92 и А-95. Резервируемые слова состоят из букв, цифр и символа "-". Смотрим в таблицу специальных символов: символ "-" там присутствует, однако специальным образом будет интерпретироваться только когда стоит в квадратных скобках. Поэтому мы можем зарезервировать А-92 и А-95 так как они пишутся в тексте, без дополнительных ухищрений. Допустим, что в нашем тексте могут встретиться и другие марки бензина. Какие именно - мы заранее не знаем, однако нам известен шаблон написания этих марок:

одна или две буквы верхнего регистра-две цифры

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

\u?\u-\d\d

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

Пример 2. Необходимо зарезервировать все слова, написанные с большой буквы, если они не стоят в начале предложения.

“Предложение содержит слова: Первое, Второе и Третье. Это предложение содержит Четвертое.”

Слова, которые должны быть зарезервированы: “Первое“, “Второе“, “Третье“, “Четвертое“. Попробуем решить задачу следующим регулярным выражением:

\u\w

После перевода мы увидим, что у нас получился вот такой список зарезервированных слов: “Предложение”, “Первое“, “Второе“, “Третье“, “Это”, “Четвертое“. Слова “Предложение” и  “Это” в списке явно лишние. Они написаны с большой буквы, однако стоят в начале предложения. Необходимо внести в регулярное выражение проверку, что слово не стоит в начале предложения. Попробуем резервировать слова с большой буквы только, если перед ними стоит пробел:

\b+{\u\w}

Фигурные скобки имеют в данном случае специальное значение при резервировании. Скобки отмечают какую часть совпавшей строки необходимо зарезервировать. Если скобки не ставить, то будет зарезервировано все, включая пробел. После перевода в этом случае получим: “Первое“, “Второе“, “Третье“, “Это”, “Четвертое“. Однако слово “Это” по-прежнему подходит под шаблон т.к. перед ним стоит пробел. Делаем последний шаг:

[^.!?]\b+{\u\w}

Теперь зарезервированы только нужные слова.

В программе имеется возможность зарезервировать слово, только если оно написано шрифтом с заданными свойствами. Механизм регулярных выражений при этом работает совместно с проверкой форматных признаков: слово будет зарезервировано, если оно имеет заданный шрифт И подходит под шаблон регулярного выражения.

Пример 3. Необходимо зарезервировать все слова, написанные полужирным шрифтом. Если между словами стоят только пробелы, то такие слова необходимо объединять и резервировать как словосочетания. Начнем решение с регулярного выражения, которое резервирует все слова:

\w

Если несколько слов разделены пробелами, то это словосочетание. Зарезервируем все словосочетания:

(\w\b)*\w

Остался последний шаг: указать, что данное слово необходимо резервировать, только если оно написано полужирным шрифтом - для этого в диалоге Зарезервировать слово отметьте опцию Формат шрифта и в появившемся диалоге с настройками шрифтов выберите Полужирный.