Шаблон регулярных выражений ведет себя по-разному в TCL по сравнению с Perl и Python

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

Python Solution

x = r'CAR_2_ABC_547_d'
>>> spattern = re.compile("CAR_.*?_(.*)")
>>> spattern.search(x).group(1)
'ABC_547_d'
>>>

Perl Solution

$ echo "CAR_2_ABC_547_d" | perl -pe's/CAR_.*?_(.*)/$1/'
ABC_547_d

TCL Solution

Тем не менее, когда я пытаюсь использовать этот подход в TclЭто дает мне разные результаты. Может ли кто-нибудь прокомментировать это поведение

% regexp -inline "CAR_.*?_(.*)" "CAR_2_ABC_547_d"
CAR_2_ {}

2 ответа

Ветвь имеет то же предпочтение, что и первый количественный атом в ней, который имеет предпочтение.

Так что если у вас есть .* как первый квантификатор, весь RE будет жадным, и если у вас есть .*? как первый квантификатор, весь RE будет не жадным.

Так как вы использовали .*? Во-первых, дальнейшее выражение следует только за ленивым режимом.

Если вы добавите конец строки $тогда оно будет соответствовать целому.

% regexp -inline "CAR_.*?_(.*)$" "CAR_2_ABC_547_d"
CAR_2_ABC_547_d ABC_547_d

Ссылка: re_syntax

Другой подход, вместо записи текста, следующего за префиксом, состоит в том, чтобы просто удалить префикс:

% set result [regsub {^CAR_.*?_} "CAR_2_ABC_547_d" {}]
ABC_547_d
Другие вопросы по тегам