Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl regex\d+;和[0-9]运算符只显示字母数字字符串中的单个数字_Regex_Linux_String_Perl - Fatal编程技术网

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