RegEx для сопоставления конкретных числовых шаблонов - PullRequest
1 голос
/ 28 мая 2019

Я хочу сопоставить числа без знаков или оператора, поэтому я пришел к этому регулярному выражению.

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

но это не соответствует строке. Почему два вида сзади не работают? Если я сделаю

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

Я получаю правильный результат 123, но когда я делаю grep -Po '(?<=-)123 (?<=\+)1234', вторая часть не совпадает.

Мой желаемый результат:

123 1234

Ответы [ 3 ]

4 голосов
/ 28 мая 2019

В шаблонах регулярных выражений 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
2 голосов
/ 28 мая 2019

Может случиться так, что вы просто захотите сопоставить числа

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'

, в этом случае + или - потребляются.

0 голосов
/ 28 мая 2019

Если вы действительно хотите извлечь числа, которым предшествует - или +, то вы можете использовать:

echo '-123 +1234 456' | grep -oP '(?<=-|\+)\d+'
123
1234

Если вы просто хотите извлечь любую последовательность цифр (это само слово) , тогда использование grep в perl, например, регулярное выражение не требуется, и вы можете просто использовать:

 echo '-123 +1234 456' | grep -Eo '\b[0-9]+\b'
...