正则表达式,用于匹配特定的数字模式

时间:2019-05-28 06:24:34

标签: regex perl grep regex-lookarounds regex-group

我想匹配没有符号或运算符的数字,所以我提出了这个正则表达式。

echo "-123 +1234" | grep -Po '(?<=-)123 (?<=\+)1234'

,但与字符串不匹配。为什么两个后方都不起作用?如果我这样做

echo "-123 +1234" | grep -Po '(?<=-)123

我得到正确的结果123,但是当我做grep -Po '(?<=-)123 (?<=\+)1234'时,第二部分不匹配。

我想要的结果:

123 1234

3 个答案:

答案 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'