Spec-Zone.ru › Tcl/Tk

re_syntax

NAME
re_syntax — Синтаксис регулярных выражений Tcl
DESCRIPTION
РАЗЛИЧНЫЕ ВИДЫ РЕ
СИНТАКСИС РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ
КВАНТИФИКАТОРЫ
*
+
?
{m}
{m,}
{m,n}
*? +? ?? {m}? {m,}? {m,n}?
АТОМЫ
(re)
(?:re)
()
(?:)
[chars]
.
\k
\c
{
x
ОГРАНИЧЕНИЯ
^
$
(?=re)
(?!re)
ВЫРАЖЕНИЯ В КВАДРАТНЫХ СКОБКАХ
КЛАССЫ СИМВОЛОВ
alpha
upper
lower
digit
xdigit
alnum
print
blank
space
punct
graph
cntrl
ОГРАНИЧЕНИЯ В КВАДРАТНЫХ СКОБКАХ
ЭЛЕМЕНТЫ СОРТИРОВКИ
КЛАССЫ ЭКВИВАЛЕНТНОСТИ
ЭСКЕЙПЫ
ЭСКЕЙПЫ ДЛЯ ВВОДА СИМВОЛОВ
\a
\b
\B
\cX
\e
\f
\n
\r
\t
\uwxyz
\Ustuvwxyz
\v
\xhh
\0
\xyz
\xy
КРАТКИЕ ЗАПИСИ КЛАССОВ
\d
\s
\w
\D
\S
\W
ЭСКЕЙПЫ ДЛЯ ОГРАНИЧЕНИЙ
\A
\m
\M
\y
\Y
\Z
\m
\mnn
ССЫЛКИ НА ПРЕДЫДУЩИЕ СООТВЕТСТВИЯ
МЕТАСИНТАКСИС
b
c
e
i
m
n
p
q
s
t
w
x
СОПОСТАВЛЕНИЕ
ПРЕДЕЛЫ И СООТВЕТСТВИЕ
БАЗОВЫЕ РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
СМОТРИТЕ ТАКЖЕ
КЛЮЧЕВЫЕ СЛОВА

Имя

re_syntax — Синтаксис регулярных выражений Tcl

Описание

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

Различные виды РЕ

Регулярные выражения («РЕ»), как определено POSIX, бывают двух типов: расширенные РЕ («ERE») и базовые РЕ («BRE»). ERE примерно соответствуют традиционным egrep, а BRE — традиционным ed. Эта реализация добавляет третий тип, расширенные РЕ («ARE»), по сути, ERE с некоторыми существенными расширениями.

Эта страница справки в основном описывает ARE. BRE в основном существуют для обратной совместимости в некоторых старых программах; они будут обсуждаться в конце. POSIX ERE являются почти точным подмножеством ARE. Особенности ARE, которых нет в ERE, будут указаны.

Синтаксис регулярных выражений

Регулярные выражения Tcl реализованы с помощью пакета, написанного Генри Спенсером, основанного на спецификации 1003.2 и некоторых (не всех) расширениях Perl5 (спасибо, Генри!). Большая часть описания регулярных выражений ниже скопирована дословно из его записи справки.

ARE состоит из одного или нескольких ветвей, разделённых «|», соответствующих любому совпадению с любой из ветвей.

Ветвь — это ноль или более ограничений или квантифицированных атомов, соединённых вместе. Она соответствует совпадению с первым, затем совпадению со вторым и т. д.; пустая ветвь соответствует пустой строке.

Квантификаторы

Квантифицированный атом — это атом, возможно, за которым следует один квантификатор. Без квантификатора он соответствует одному совпадению с атомом. Квантификаторы и то, чему соответствует квантифицированный атом, следующие:
*
Последовательность из 0 или более совпадений с атомом
+
Последовательность из 1 или более совпадений с атомом
?
Последовательность из 0 или 1 совпадения с атомом
{m}
Последовательность ровно из m совпадений с атомом
{m,}
Последовательность из m или более совпадений с атомом
{m,n}
Последовательность от m до n (включительно) совпадений с атомом; m не должно превышать n
*? +? ?? {m}? {m,}? {m,n}?
Нежадные квантификаторы, которые соответствуют тем же возможностям, но предпочитают наименьшее число, а не наибольшее число совпадений (см. СОПОСТАВЛЕНИЕ)

Формы с { и } известны как пределы. Числа m и n — это целые десятичные числа без знака со значениями от 0 до 255 включительно.

Атомы

Атом — это одно из:
(re)
соответствует совпадению с re (re — любой регулярный выражение) с отмеченным совпадением для возможного отчёта
(?:re)
как предыдущее, но без отчёта (незахватывающая группа скобок)
()
соответствует пустой строке, отмеченной для возможного отчёта
(?:)
соответствует пустой строке, без отчёта
[chars]
выражение в квадратных скобках, соответствующее любому из символов chars (см. ВЫРАЖЕНИЯ В КВАДРАТНЫХ СКОБКАХ для более подробной информации)
.
соответствует любому одиночному символу
\k
соответствует небуквенному символу k, воспринимаемому как обычный символ, например, \\ соответствует символу обратного слэша
\c
где c — буквенный символ (возможно, за которым следуют другие символы), управляющий символ (только ARE), см. УПРАВЛЯЮЩИЕ СИМВОЛЫ ниже
{
если за ним следует символ, отличный от цифры, соответствует символу левой фигурной скобки «{»; если за ним следует цифра, это начало связанного элемента (см. выше)
x
где x — одиночный символ без другого значения, соответствует этому символу.

Ограничения

Ограничение соответствует пустой строке, когда выполнены определённые условия. Ограничение не может быть после квантификатора. Простейшие ограничения приведены ниже; некоторые дополнительные ограничения описаны далее, в разделе УПРАВЛЯЮЩИЕ СИМВОЛЫ.
^
соответствует началу строки
$
соответствует концу строки
(?=re)
положительный просмотр вперёд (только ARE), соответствует любому моменту, где начинается подстрока, соответствующая re
(?!re)
отрицательный просмотр вперёд (только ARE), соответствует любому моменту, где не начинается подстрока, соответствующая re

Ограничения просмотра вперёд не могут содержать обратных ссылок (см. далее), и все скобки в них считаются незахватывающими.

Регулярное выражение не может заканчиваться на «\».

Выражения в квадратных скобках

Выражение в квадратных скобках — это список символов, заключённых в «[ ]». Обычно оно соответствует любому одиночному символу из списка (но см. ниже). Если список начинается с «^», он соответствует любому одиночному символу (но см. ниже) не из остальной части списка.

Если два символа в списке разделены «-», это сокращение для всего диапазона символов между этими двумя (включительно) в последовательности сопоставления, например, «[0-9]» в Unicode соответствует любой обычной десятичной цифре. Два диапазона не могут иметь общую конечную точку, поэтому, например, «a-c-e» является недопустимым. Диапазоны в Tcl всегда используют последовательность сопоставления Unicode, но другие программы могут использовать другие последовательности сопоставления, и это может быть источником несовместимости между программами.

Чтобы включить буквальный символ ] или - в список, самый простой способ — заключить его в [. и .], чтобы сделать его элементом сопоставления (см. ниже). В качестве альтернативы, сделайте его первым символом (после возможного «^»), или (только ARE) предваряйте его «\». В качестве альтернативы, для «-», сделайте его последним символом или второй конечной точкой диапазона. Чтобы использовать буквальный - в качестве первой конечной точки диапазона, сделайте его элементом сопоставления или (только ARE) предваряйте его «\». За исключением этих случаев, некоторые комбинации с [ (см. следующие абзацы) и управляющими символами, все остальные специальные символы теряют своё специальное значение внутри выражения в квадратных скобках.

Классы символов

Внутри выражения в квадратных скобках имя класса символов, заключённое в [: и :], обозначает список всех символов (не всех элементов сопоставления!) принадлежащих этому классу. Стандартные классы символов:
alpha
Буква.
upper
Заглавная буква.
lower
Строчная буква.
digit
Десятичная цифра.
xdigit
Шестнадцатеричная цифра.
alnum
Буквенно-цифровой символ (буква или цифра).
print
"Печатный" (то же самое, что графический, кроме добавления пробела).
blank
Пробел или табуляция.
space
Символ, создающий пробел в отображаемом тексте.
punct
Знак препинания.
graph
Символ с видимым представлением (включает как alnum, так и punct).
cntrl
Управляющий символ.

Локаль может предоставлять другие. Класс символов не может использоваться в качестве конечной точки диапазона.

(Примечание: текущая реализация Tcl имеет только одну локаль, локаль Unicode, которая поддерживает именно вышеперечисленные классы.)

Ограничения в квадратных скобках

Существует два особых случая выражений в квадратных скобках: выражения в квадратных скобках «[[:<:]]» и «[[:>:]]» — это ограничения, соответствующие пустым строкам в начале и конце слова соответственно. Слово определяется как последовательность символов слова, не предшествующих и не следующих за символами слова. Символ слова — это alnum-символ или символ нижнего подчёркивания («_»). Эти специальные выражения в квадратных скобках устарели; пользователи ARE должны использовать управляющие символы ограничений вместо них (см. ниже).

Элементы сопоставления

Внутри выражения в квадратных скобках элемент сопоставления (символ, многосимвольная последовательность, которая сопоставляется как одиночный символ, или имя последовательности сопоставления для любого из них), заключённый в [. и .], обозначает последовательность символов данного элемента сопоставления. Последовательность является единственным элементом списка выражения в квадратных скобках. Таким образом, выражение в квадратных скобках в локали, имеющей многосимвольные элементы сопоставления, может соответствовать более чем одному символу. Поэтому (хитро) выражение в квадратных скобках, начинающееся с ^, может соответствовать многосимвольным элементам сопоставления, даже если ни один из них не появляется в выражении в квадратных скобках!

(Примечание: Tcl не имеет многосимвольных элементов сопоставления. Эта информация предназначена только для иллюстрации.)

Например, предположим, что последовательность сопоставления включает многосимвольный элемент сопоставления ch. Тогда регулярное выражение «[[.ch.]]*c» (ноль или более «ch», за которым следует «c») соответствует первым пяти символам «chchcc». Кроме того, регулярное выражение «[^c]b» соответствует всему «chb» (потому что «[^c]» соответствует многосимвольному «ch»).

Классы эквивалентности

Внутри выражения в квадратных скобках элемент сопоставления, заключённый в [= и =], является классом эквивалентности, обозначающим последовательности символов всех элементов сопоставления, эквивалентных этому элементу, включая сам элемент. (Если нет других эквивалентных элементов сопоставления, обработка ведётся так, как если бы заключительные разделители были «[.» и «.]».) Например, если o и ô являются членами класса эквивалентности, то «[[=o=]]», «[[=ô=]]» и «[oô]» являются синонимами. Класс эквивалентности не может быть конечной точкой диапазона.

(Примечание: Tcl реализует только локаль Unicode. Она не определяет никаких классов эквивалентности. Приведённые выше примеры — просто иллюстрации.)

Управляющие символы

Управляющие символы (только ARE), которые начинаются с \, за которым следует буквенный символ, бывают нескольких типов: ввод символов, сокращения классов, управляющие символы ограничений и обратные ссылки. \, за которым следует буквенный символ, но не образующий допустимый управляющий символ, недопустим в ARE. В ERE нет управляющих символов: за пределами выражения в квадратных скобках \, за которым следует буквенный символ, просто обозначает этот символ как обычный символ, а внутри выражения в квадратных скобках \ — это обычный символ. (Последнее — это фактическая несовместимость между ERE и ARE.)

Управляющие символы ввода символов

Управляющие символы ввода символов (только ARE) существуют, чтобы упростить указание непечатаемых и других неудобных символов в регулярных выражениях:
\a
управляющий символ сигнала (звонок), как в C
\b
возврат на позицию, как в C
\B
синоним для \, чтобы уменьшить удваивание обратных слэшей в некоторых приложениях, где существует несколько уровней обработки обратных слэшей
\cX
(где X — любой символ) символ, у которого младшие 5 бит такие же, как у X, а остальные биты равны нулю
\e
символ, чьё имя последовательности сопоставления «ESC», или в противном случае символ с восьмеричным значением 033
\f
перевод страницы, как в C
\n
перевод строки, как в C
\r
возврат каретки, как в C
\t
горизонтальная табуляция, как в C
\uwxyz
(где wxyz — одна до четырёх шестнадцатеричных цифр) символ Unicode U+wxyz в локальном порядке байтов
\Ustuvwxyz
(где stuvwxyz — одна до восьми шестнадцатеричных цифр) зарезервировано для расширения Unicode до 21 бита. Цифры анализируются до тех пор, пока не встретится первый нешестнадцатеричный символ, не будет достигнуто максимальное количество восьми шестнадцатеричных цифр или не произойдёт переполнение в максимальном значении U+10ffff.
\v
вертикальная табуляция, как в C все доступны.
\xhh
(где hh — одна или две шестнадцатеричные цифры) символ, шестнадцатеричное значение которого равно 0xhh.
\0
символ, значение которого равно 0
\xyz
(где xyz — ровно три восьмеричные цифры и не является обратной ссылкой (см. ниже)) символ, восьмеричное значение которого равно 0xyz. Первая цифра должна быть в диапазоне 0-3, в противном случае предполагается двухзначный вид.
\xy
(где xy — ровно две восьмеричные цифры и не является обратной ссылкой (см. ниже)) символ, восьмеричное значение которого равно 0xy

Шестнадцатеричные цифры — «0–9», «a–f» и «A–F». Восьмеричные цифры — «0–7».

Управляющие символы ввода символов всегда воспринимаются как обычные символы. Например, \135 — это ] в Unicode, но \135 не завершает выражение в квадратных скобках. Однако будьте осторожны, так как некоторые приложения (например, компиляторы C и интерпретатор Tcl, если регулярное выражение не заключено в фигурные скобки) интерпретируют такие последовательности сами до того, как пакет регулярных выражений увидит их, что может потребовать удвоения (четверного и т. д.) «\».

Сокращения классов

Сокращения классов (только ARE) предоставляют сокращения для некоторых часто используемых классов символов:
\d
[[:digit:]]
\s
[[:space:]]
\w
[[:alnum:]_] (примечание: нижнее подчёркивание)
\D
[^[:digit:]]
\S
[^[:space:]]
\W
[^[:alnum:]_] (примечание: нижнее подчёркивание)

В выражениях в квадратных скобках «\d», «\s» и «\w» теряют свои внешние скобки, а «\D», «\S» и «\W» являются недопустимыми. (Например, «[a-c\d]» эквивалентно «[a-c[:digit:]]». Также «[a-c\D]», что эквивалентно «[a-c^[:digit:]]», недопустимо.)

Экранирование ограничений

Экранирование ограничения (только ARE) — это ограничение, которое соответствует пустой строке, если выполнены определённые условия, записанное как экранирование:
\A
соответствует только в начале строки (см. СОПОСТАВЛЕНИЕ ниже, как это отличается от «^»)
\m
соответствует только в начале слова
\M
соответствует только в конце слова
\y
соответствует только в начале или конце слова
\Y
соответствует только в точке, которая не является началом или концом слова
\Z
соответствует только в конце строки (см. СОПОСТАВЛЕНИЕ ниже, как это отличается от «$»)
\m
(где m — ненулевая цифра) ссылка назад, см. ниже
\mnn
(где m — ненулевая цифра, а nn — ещё несколько цифр, и десятичное значение mnn не больше числа закрывающих скобок захвата, увиденных до сих пор) ссылка назад, см. ниже

Слово определяется так же, как и в спецификации «[[:<:]]» и «[[:>:]]» выше. Экранирования ограничений недопустимы внутри выражений в квадратных скобках.

Ссылки назад

Ссылка назад (только ARE) соответствует той же строке, что и подвыражение в скобках, указанное числом, так что (например) «([bc])\1» соответствует «bb» или «cc», но не «bc». Подвыражение должно полностью предшествовать ссылке назад в RE. Подвыражения нумеруются в порядке их ведущих скобок. Незахватывающие скобки не определяют подвыражения.

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

Метасинтаксис

Кроме основной синтаксической конструкции, описанной выше, существуют некоторые специальные формы и различные синтаксические средства.

Обычно вид используемого RE определяется средствами, зависящими от приложения. Однако это можно переопределить с помощью директора. Если RE любого вида начинается с «***:», остальная часть RE — это ARE. Если RE любого вида начинается с «***=», остальная часть RE рассматривается как строка без изменений, все символы считаются обычными символами.

ARE может начинаться с встроенных опций: последовательность (?xyz) (где xyz — одна или несколько букв) указывает опции, влияющие на остальную часть RE. Эти опции дополняют и могут переопределять любые опции, указанные приложением. Доступные буквы опций:

b
остальная часть RE — это BRE
c
чувствительное к регистру сопоставление (обычное значение по умолчанию)
e
остальная часть RE — это ERE
i
сопоставление без учёта регистра (см. СОПОСТАВЛЕНИЕ ниже)
m
исторический синоним для n
n
чувствительное к новой строке сопоставление (см. СОПОСТАВЛЕНИЕ ниже)
p
частичное чувствительное к новой строке сопоставление (см. СОПОСТАВЛЕНИЕ ниже)
q
остальная часть RE — это буквальная («цитируемая») строка, все обычные символы
s
сопоставление без учёта новой строки (обычное значение по умолчанию)
t
жёсткий синтаксис (обычное значение по умолчанию; см. ниже)
w
обратное частично чувствительное к новой строке («странное») сопоставление (см. СОПОСТАВЛЕНИЕ ниже)
x
расширенный синтаксис (см. ниже)

Встроенные опции действуют до закрывающей скобки ), завершающей последовательность. Они доступны только в начале ARE и не могут использоваться позже в нём.

В дополнение к обычному (жёсткому) синтаксису RE, в котором все символы имеют значение, существует расширенный синтаксис, доступный во всех видах RE с переключателем -expanded или в ARE с встроенной опцией x. В расширенном синтаксисе пробельные символы игнорируются, и все символы между # и следующей новой строкой (или концом RE) игнорируются, что позволяет форматировать и комментировать сложный RE. Существует три исключения из этого основного правила:

  • пробельный символ или «#», предшествующий «\», сохраняется
  • пробельные символы или «#» внутри выражения в квадратных скобках сохраняются
  • пробелы и комментарии недопустимы внутри многосимвольных символов, таких как ARE «(?:» или BRE «\(»

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

Наконец, в ARE за пределами выражений в квадратных скобках последовательность «(?#ttt)» (где ttt — любой текст, не содержащий «)») — комментарий, полностью игнорируется. Опять же, это недопустимо между символами многосимвольных символов, таких как «(?:». Такие комментарии больше являются историческим артефактом, чем полезным средством, и их использование не рекомендуется; вместо этого используйте расширенный синтаксис.

Ни одно из этих расширений метасинтаксиса недоступно, если приложение (или начальный «***=» директор) указало, что вход пользователя должен рассматриваться как буквальная строка, а не как RE.

Сопоставление

В случае, если RE может соответствовать более чем одной подстроке данной строки, RE соответствует той, которая начинается раньше в строке. Если RE может соответствовать более чем одной подстроке, начинающейся в этой точке, его выбор определяется его предпочтением: либо самой длинной подстрокой, либо самой короткой.

Большинство атомов и все ограничения не имеют предпочтения. Подвыражение RE имеет то же предпочтение (возможно, отсутствующее), что и само RE. Атом с квантификатором {m} или {m}? имеет то же предпочтение (возможно, отсутствующее), что и сам атом. Атом с другими обычными квантификаторами (включая {m,n} с m равным n) предпочитает наибольшее совпадение. Атом с другими нежадными квантификаторами (включая {m,n}? с m равным n) предпочитает наименьшее совпадение. Ветвь имеет то же предпочтение, что и первый квантифицированный атом в ней, имеющий предпочтение. RE, состоящий из двух или более ветвей, соединённых оператором |, предпочитает наибольшее совпадение.

С учётом ограничений, налагаемых правилами сопоставления всего RE, подвыражения также соответствуют самым длинным или самым коротким возможным подстрокам, в зависимости от их предпочтений, при этом подвыражения, начинающиеся раньше в RE, имеют приоритет над теми, которые начинаются позже. Обратите внимание, что внешние подвыражения таким образом имеют приоритет над их составными подвыражениями.

Квантификаторы {1,1} и {1,1}? могут использоваться для принудительного наибольшего и наименьшего предпочтения соответственно для подвыражения или всего RE.

ПРИМЕЧАНИЕ: Это означает, что вы обычно можете сделать RE нежадным в целом, поместив {1,1}? после одного из первых атомов без ограничений или подвыражений в скобках в нём. Стоит поэкспериментировать с размещением этого переопределения нежадности на подходящем диапазоне входных текстов при написании RE, если вы используете этот уровень сложности.

Например, это регулярное выражение нежадное и будет соответствовать кратчайшей возможной подстроке, учитывая, что «abc» будет соответствовать как можно раньше (квантификатор не изменяет это):

ab{1,1}?c.*x.*cba

Атом «a» не имеет предпочтения в отношении жадности, мы явно задаём его для «b», а оставшиеся квантификаторы переопределяются как нежадные предшествующим нежадным квантификатором.

Длины совпадений измеряются в символах, а не в элементах сортировки. Пустая строка считается длиннее, чем вообще никакого совпадения. Например, «bb*» соответствует трём средним символам «abbbc», «(week|wee)(night|knights)» соответствует всем десяти символам «weeknights», когда «(.*).*» сопоставляется со строкой «abc», подвыражение в скобках соответствует всем трём символам, а когда «(a*)*» сопоставляется со строкой «bc», и всё RE, и подвыражение в скобках соответствуют пустой строке.

Если указано сопоставление без учёта регистра, эффект аналогичен тому, как если бы все различия в регистре исчезли из алфавита. Когда буквенный символ, который существует в нескольких регистрах, появляется как обычный символ вне выражения в квадратных скобках, он фактически преобразуется в выражение в квадратных скобках, содержащее оба регистра, так что x становится «[xX]». Когда он появляется внутри выражения в квадратных скобках, все аналогичные регистры добавляются к выражению в квадратных скобках, так что «[x]» становится «[xX]», а «[^x]» становится «[^xX]».

Если указано чувствительное к новой строке сопоставление, . и выражения в квадратных скобках с использованием ^ никогда не будут соответствовать символу новой строки (так что совпадения никогда не будут переходить через новые строки, если RE явно этого не организует), а ^ и $ будут соответствовать пустой строке после и перед новой строкой соответственно, кроме соответствия в начале и конце строки соответственно. ARE \A и \Z по-прежнему соответствуют только началу или концу строки.

Если указано частичное чувствительное к новой строке сопоставление, это влияет на . и выражения в квадратных скобках, как и при чувствительном к новой строке сопоставлении, но не на ^ и $.

Если указано обратное частично чувствительное к новой строке сопоставление, это влияет на ^ и $, как и при чувствительном к новой строке сопоставлении, но не на . и выражения в квадратных скобках. Это не очень полезно, но предоставляется для симметрии.

Ограничения и совместимость

Ограничений на длину RE нет. Программы, предназначенные для высокой портативности, не должны использовать RE длиннее 256 байт, так как POSIX-совместимая реализация может отказать в приёме таких RE.

Единственное свойство ARE, которое фактически несовместимо с POSIX ERE, заключается в том, что \ не теряет своего специального значения внутри выражений в квадратных скобках. Все остальные свойства ARE используют синтаксис, который является недопустимым или имеет неопределённые или неспецифицированные эффекты в POSIX ERE; синтаксис *** директоров также находится за пределами POSIX-синтаксиса как для BRE, так и для ERE.

Многие расширения ARE заимствованы из Perl, но некоторые были изменены для улучшения, а некоторые расширения Perl отсутствуют. Отмечаемые несовместимости включают «\b», «\B», отсутствие специального обращения к заключительной новой строке, добавление дополненных выражений в скобках к элементам, на которые влияет чувствительность к новой строке, ограничения на скобки и обратные ссылки в ограничениях поиска вперед и семантику сопоставления «самый длинный/самый короткий» (а не первого сопоставления).

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

Исходный пакет regexp Генри Спенсера 1986 года, который до сих пор широко используется (например, в выпусках Tcl до 8.1), реализовал раннюю версию сегодняшних ERE. Существует четыре несовместимости между почти-ERE пакета regexp («RRE» для краткости) и ARE. В примерно возрастающем порядке значимости:

  • В ARE \, за которым следует буквенно-цифровой символ, является либо экранированием, либо ошибкой, тогда как в RRE это просто другой способ записи буквенно-цифрового символа. Это не должно быть проблемой, потому что не было причин писать такие последовательности в RRE.
  • {, за которым следует цифра в ARE, — это начало границы, тогда как в RRE { всегда был обычным символом. Такие последовательности должны быть редкими и часто приводят к ошибке, потому что последующие символы не будут похожи на допустимую границу.
  • В ARE \ остается специальным символом внутри «[ ]», поэтому для буквального \ внутри [ ] необходимо написать «\\». \\ также дает буквальный \ внутри [ ] в RRE, но только действительно параноидальные программисты регулярно удваивают обратную косую черту.
  • ARE сообщают о самом длинном/самом коротком совпадении для RE, а не о первом найденном в указанном порядке поиска. Это может повлиять на некоторые RRE, которые были написаны в ожидании того, что будет сообщено о первом совпадении. (Тщательное составление RRE для оптимизации порядка поиска для быстрого сопоставления устарело (ARE проверяют все возможные совпадения параллельно, и их производительность в значительной степени не зависит от их сложности), но случаи, когда порядок поиска использовался для преднамеренного поиска совпадения, которое не было самым длинным/самым коротким, потребуется переписать.)

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

BRE отличаются от ERE по нескольким пунктам. «|», «+» и ? — это обычные символы, и для их функциональности нет эквивалента. Разделители для границ — \{ и «\}», а { и } сами по себе — обычные символы. Скобки для вложенных подвыражений — \( и «\)», а ( и ) сами по себе — обычные символы. ^ — это обычный символ, за исключением начала RE или начала скобочного подвыражения, $ — это обычный символ, за исключением конца RE или конца скобочного подвыражения, и * — это обычный символ, если он появляется в начале RE или в начале скобочного подвыражения (после возможного ведущего «^»). Наконец, доступны обратные ссылки с одной цифрой, а \< и \> являются синонимами «[[:<:]]» и «[[:>:]]» соответственно; другие экранирования недоступны.

См. также

RegExp, regexp, regsub, lsearch, switch, text

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/re_syntax.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/re_syntax.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API