Шаблон регулярных выражений ведет себя по-разному в 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