0

我有一个字符串:

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

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

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

4

2 回答 2

3

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

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

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

注意--; 这里需要它,因为正则表达式以-符号开头,否则会被混淆为奇怪(且不受支持)的选项。除了那一个小问题,这一切都是直截了当的。

于 2012-08-10T12:40:04.730 回答
1
$str = "ODUCTP-1-1-1-2P1";
$str =~ s/^.*?-//;
print $str;

或者:

$str =~ /^.*?-(.*)$/;
print $1;
于 2012-08-10T11:58:24.413 回答