使用正则表达式获取值

时间:2012-08-10 11:47:31

标签: regex perl tcl

我有一个字符串:

set a "ODUCTP-1-1-1-2P1"
regexp {.*?\-(.*)} $a match sub

我希望sub的值为1-1-1-2P1

但我得到空字符串。谁能告诉我如何正确使用正则表达式?

2 个答案:

答案 0 :(得分:3)

问题是.*?的非贪婪后来泄漏到.*,这是使用RE引擎的一个特征(自动理论而不是基于堆栈) )。

最简单的解决方法是以不同方式编写正则表达式。 因为Tcl具有未锚定的正则表达式(默认情况下)并且尽快开始匹配,所以从第一个-到字符串末尾的贪婪匹配是完美的(在sub之后分配了所有内容。 -)。这是一个非常简单的RE:-(.*)。要使用它,请执行以下操作:

regexp -- {-(.*)} $a match sub

注意--;这里需要它,因为正则表达式以-符号开头,否则会被混淆为怪异(和不支持)选项。除了这一点之外,它完全是直截了当的。

答案 1 :(得分:1)

$str = "ODUCTP-1-1-1-2P1";
$str =~ s/^.*?-//;
print $str;

或:

$str =~ /^.*?-(.*)$/;
print $1;