2

我正在尝试使用正则表达式从字符串中提取子字符串。以下是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_ {}
4

2 回答 2

4

分支具有与其中具有偏好的第一个量化原子相同的偏好。

所以如果你有.*作为第一个量词,整个 RE 将是贪婪的,如果你有.*?作为第一个量词,整个 RE 将是非贪婪的。

由于您.*?首先使用了 本身,因此进一步的表达式仅遵循惰性模式。

如果你添加 end of line $,那么它将匹配整个。

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

参考: re_syntax

于 2016-09-06T10:51:16.310 回答
1

另一种方法不是捕获前缀后面的文本,而是删除前缀:

% set result [regsub {^CAR_.*?_} "CAR_2_ABC_547_d" {}]
ABC_547_d
于 2016-09-06T17:38:18.970 回答