Regex 具有Perl风格语法的两位数Grep
所以我要看一下O'Reilly的正则表达式袖珍参考 我发现了一个例子:Regex 具有Perl风格语法的两位数Grep,regex,perl,grep,Regex,Perl,Grep,所以我要看一下O'Reilly的正则表达式袖珍参考 我发现了一个例子: /^\d{1,6}$/ 应该匹配任何1-6位数字 然而,当我试图在Ubuntu上通过带有PCRE语法的grep运行它时,它只匹配1位数字 我是这样运行的: grep -P "^\d{1,6}^" * 所以我用Perl对它进行了一次尝试,它似乎按照预期工作: $example = 600; if($example =~ /^\d{1,6}^/){ print "Gotcha! \n"; # fires as
/^\d{1,6}$/
应该匹配任何1-6位数字
然而,当我试图在Ubuntu上通过带有PCRE语法的grep运行它时,它只匹配1位数字
我是这样运行的:
grep -P "^\d{1,6}^" *
所以我用Perl对它进行了一次尝试,它似乎按照预期工作:
$example = 600;
if($example =~ /^\d{1,6}^/){
print "Gotcha! \n"; # fires as it should
} else {
print "failed \n"; #doesn't fire
}
$counterexample = 6000000000000000000000;
if($counterexample =~ /^d{1,6}$/{
print "This shouldn't be \n"; # does not fire, as intended
} else {
print "also correct \n"; # Fires as intended
}
那么,grep的行为不应该与-p标志相同吗
我肯定我错过了一些重要的东西
更新
已将秒^
更正为$
grep -P "^\d{1,6}$" *
我注意到它似乎可以处理像这样的文件
//example file.txt works as intended
12
123
12345
1234567
//but this doesn't work
600 500 20
// Just matches the first one
以下工作很好:
$ cat > 'test'
qwer
1234
1234567
12
qwer
^C
$ grep -P "^\d{1,6}$" *
test:1234
test:12
您使用第二个^
是打字错误,还是您真的打算使用它而不是$
更新
为什么它与新的示例相匹配<代码>600 500 20
这些数字之间有空格,您使用的正则表达式由行的开始和结束的锚定^
和$
限定。如果你想让这些数字匹配,你就必须使用单词边界锚<代码>/\b\d{1,6}\b/
换句话说,您的正则表达式按预期运行。输入错误。用你的例子试过了,成功了。已编辑问题,已更新您对问题的更改。谢谢!现在我觉得这很有道理。