Perl regex\d+;和[0-9]运算符只显示字母数字字符串中的单个数字
我遇到了以下问题:如果在第一个示例中使用代码,变量Perl regex\d+;和[0-9]运算符只显示字母数字字符串中的单个数字,regex,linux,string,perl,Regex,Linux,String,Perl,我遇到了以下问题:如果在第一个示例中使用代码,变量$1只包含每个字符串的最后一位。但是,如果我使用第三个示例,其中每个“字符串”都只是一个数字,$1变量显示所有数字的完整数字。在我看来,\d+操作符在字母数字上下文和数字上下文中的工作方式不同 这里是我的问题:你能复制这个吗?这种行为是故意的吗?如何在perl中使用正则表达式操作捕获字母数字上下文中的完整数字?如果\d操作符本质上是懒惰的,我能让它更贪婪吗(如果是真的,我会怎么做?) 例1: perl -e 'for ($i = 199; $i
$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";}'
例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";}'
例3:
perl -e 'for ($i = 199; $i < 201; $i ++) { print "words".$i."words\n"}' | perl -ne 'if (/(\d+)/) {$num = $1; print $num,"\n";}'
提前谢谢。非常感谢您的帮助
最好的,
克里斯你得到的结果是意料之中的。在
/\A\w+(\d+)\w+/
中,第一个\w+
是一个贪婪的模式,将获取尽可能多的字符,因为\w
也匹配数字
使用惰性量词-,或从
\w
中减去数字(例如,类似于中)。\w+?
将尽可能少地匹配1个或多个单词字符(字母/数字/\u
),并且[^\w\d]
匹配任何字母或\u
符号,因此,无需使用此模式的惰性量词。问题是数字由\w匹配
您应该将“\w”替换为“\D”(“非数字”)。
例如:
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";}'
当然,如果数据在一个字符串中可以包含多个数字,则需要一些更精确的regexp。
\w
匹配数字,而\w+
匹配数字greedy@aschepler:好的,我没有考虑“单词”的可能性字符也是数字。提示:/…\w+/
可以简化为/…\w/
(除非您使用$&
)。
perl -e 'for ($i = 199; $i < 201; $i ++) { print "words".$i."words\n"}' | perl -ne 'if (/(\d+)/) {$num = $1; print $num,"\n";}'
199
200
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";}'
199
200