为什么perl忽略了我的正则表达式中的额外字符?

时间:2010-11-23 20:40:25

标签: regex perl

我在bash中有这一行:

echo "a=-1"|perl -nle 'if (/.*=[0-9]*/){print;}'

并获得:

a=-1

等等..我没有说perl应该匹配-。我做了一个小改动:

echo "a=-1"|perl -nle 'if (/.*=[0-9]*$/){print;}'

并且它正确地忽略了该行。为什么呢?

3 个答案:

答案 0 :(得分:6)

在开发正则表达式时,您可能会发现它只用于打印只有正则表达式实际匹配的字符串部分而不是整行。这将使您更好地了解正则表达式正在做什么。您可以使用特殊的$&变量执行此操作。所以而不是:

echo "a=-1"|perl -nle 'if (/.*=[0-9]*/){print;}'

使用

echo "a=-1"|perl -nle 'if (/.*=[0-9]*/){print $&;}'

现在您将获得不同的输出:

a=

这些新信息可以帮助您了解正则表达式在输入数据方面的错误行为。

答案 1 :(得分:5)

第一个例子,你说[0-9]可以发生“*”次,这意味着零或更多(所以它只匹配“=”。当你添加“$”时它不再匹配,因为它在[0-9]之后不会结束。

答案 2 :(得分:5)

[0-9] *可以匹配空字符串。当您锚定到字符串的末尾时,您阻止了此空匹配。

你可能想说[0-9] +表示“至少一个数字”。