我遇到了以下问题:如果我在第一个示例中使用代码,则变量$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
提前致谢。任何帮助都非常感谢。
最佳, 克里斯
答案 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";}'
当然,如果您的数据在一个字符串中可以包含多个数字,那么您需要一些更精确的正则表达式。