我想匹配没有符号或运算符的数字,所以我提出了这个正则表达式。
echo "-123 +1234" | grep -Po '(?<=-)123 (?<=\+)1234'
,但与字符串不匹配。为什么两个后方都不起作用?如果我这样做
echo "-123 +1234" | grep -Po '(?<=-)123
我得到正确的结果123
,但是当我做grep -Po '(?<=-)123 (?<=\+)1234'
时,第二部分不匹配。
我想要的结果:
123 1234
答案 0 :(得分:4)
在正则表达式模式中,ab
的意思是a
,后跟b
,这是b
后跟a
的另一种说法。别忘了(?<=...)
从周围模式的角度匹配零个字符,因此从周围模式的角度来看好像没有它。这意味着(?<=-)123 (?<=\+)1234
将匹配123 1234
匹配的子集。特别有趣的是,只有在1234
后面加空格时,模式才会匹配。
匹配的字符串子集是123
之前带有-
(由于(?<=-)
)而1234
之前带有+
的字符串的子集(感谢(?<=\+)
)。特别令人感兴趣的是,只有在1234
之前加上+
时,模式才会匹配。
由于(?<=-)123 (?<=\+)1234
仅在1234
前面有一个空格且前面有+
时才匹配,因此它将永远不会匹配。
不清楚您想要什么。
也许您想要这个吗?
$ echo "-123 +1234" | grep -Po '\d+'
123
1234
也许您想要这个吗?
$ echo "-123 +1234" | perl -nle'@m=/\d+/g; print "@m" if @m'
123 1234
也许您想要这个吗?
$ echo "-123 +1234" | perl -nle'print "$1 $2" if /-(\d+) \+(\d+)/'
123 1234
答案 1 :(得分:1)
可能您只想匹配数字
echo "-123 +1234" | perl -wnE'@m = /([0-9]+)/g; say for @m'
除非您希望匹配数字(仅在数字带有符号的情况下),否则
echo "-123 +1234" | perl -wnE'@m = /(?<=[+-])([0-9]+)/g; say for @m'
或者只是
echo "-123 +1234" | perl -wnE'@m = /[+-]([0-9]+)/g; say for @m'
在这种情况下,+
或-
被消耗了。
答案 2 :(得分:0)
如果您确实要提取-
或+
之前的数字,则可以使用:
echo '-123 +1234 456' | grep -oP '(?<=-|\+)\d+'
123
1234
如果您只想提取任何数字序列(本身就是一个单词),则不需要像正则表达式一样在perl
中使用grep,您可以简单地使用: / p>
echo '-123 +1234 456' | grep -Eo '\b[0-9]+\b'