Perl正则表达式\ d +和[0-9]运算符仅显示字母数字字符串中的单个数字

时间:2017-04-10 13:32:03

标签: regex linux string perl

我遇到了以下问题:如果我在第一个示例中使用代码,则变量$1仅包含每个字符串的最后一位数字。但是,如果我使用第三个示例,其中每个“字符串”只是一个数字,$1变量显示所有数字的完整数字。对我来说,似乎\d+运算符在字母数字上下文和数字上下文中的工作方式不同。

以下是我的问题:你能重现一下吗?这种行为是有意的吗?如何使用perl中的正则表达式操作捕获字母数字上下文中的完整数字?如果\d运算符的性质本质上是懒惰的,我可以让它更贪婪(如果是真的,我该怎么做?)?

示例1:

perl -e 'for ($i = 199; $i < 201; $i ++) { print "words".$i."words\n"}' | perl -ne 'if (/\A\w+(\d+)\w+/) {$num = $1; print $num,"\n";}'

输出:

9
0

示例2:

perl -e 'for ($i = 199; $i < 201; $i ++) { print "words".$i."words\n"}' | perl -ne 'if (/\A\w+([0-9]+)\w+/) {$num = $1; print $num,"\n";}'

输出:

9
0

示例3:

perl -e 'for ($i = 199; $i < 201; $i ++) { print "words".$i."words\n"}' | perl -ne 'if (/(\d+)/) {$num = $1; print $num,"\n";}'

输出:

199
200

提前致谢。任何帮助都非常感谢。

最佳, 克里斯

2 个答案:

答案 0 :(得分:4)

您获得的结果是预期的。在/\A\w+(\d+)\w+/中,第一个\w+是一个贪婪的模式,它会抓取尽可能多的字符,因为\w也匹配数字。

使用延迟量词 - /\A\w+?(\d+)\w+/,或减去\w中的数字(例如/\A[^\W\d]+(\d+)\w+/中的数字)。 \w+?将匹配1个或多个字词字符(字母/数字/ _尽可能少[^\W\d]匹配任何字母或_因此,不需要使用这种模式的惰性量词。

答案 1 :(得分:1)

问题是数字与\ w匹配。

您应将“\ w”替换为“\ D”(“非数字”)。 例如:

var varFunction = new myFunction('.classname', {
    effect: 'fade',
    duration: 2000
});

输出:

perl -e 'for ($i = 199; $i < 201; $i ++) { print "words".$i."words\n"}' | perl -ne 'if (/\A\D+(\d+)\D+/) {$num = $1; print $num,"\n";}'

当然,如果您的数据在一个字符串中可以包含多个数字,那么您需要一些更精确的正则表达式。