我正在尝试使用正则表达式从字符串中提取子字符串。以下是Python
中的工作代码(给出了所需的结果)
Python解决方案
x = r'CAR_2_ABC_547_d'
>>> spattern = re.compile("CAR_.*?_(.*)")
>>> spattern.search(x).group(1)
'ABC_547_d'
>>>
Perl解决方案
$ echo "CAR_2_ABC_547_d" | perl -pe's/CAR_.*?_(.*)/$1/'
ABC_547_d
TCL解决方案
然而,当我尝试在Tcl
中使用这种方法时,它给了我不同的结果。有人可以对此行为发表评论
% regexp -inline "CAR_.*?_(.*)" "CAR_2_ABC_547_d"
CAR_2_ {}
答案 0 :(得分:4)
分支与其中的第一个量化原子具有相同的偏好 有偏好。
所以如果你有.*
作为第一个量词,整个RE都会贪婪,
如果你有.*?
作为第一个量词,整个RE将是非贪婪的。
由于您在第一个位置使用了.*?
,因此进一步的表达式仅遵循延迟模式。
如果您添加行尾$
,那么它将匹配整个行。
% regexp -inline "CAR_.*?_(.*)$" "CAR_2_ABC_547_d"
CAR_2_ABC_547_d ABC_547_d
参考: re_syntax
答案 1 :(得分:1)
另一种方法是删除前缀:
,而不是捕获前缀后面的文本% set result [regsub {^CAR_.*?_} "CAR_2_ABC_547_d" {}]
ABC_547_d