Проблема с регулярным выражением (извлечение того или иного текста) - PullRequest
6 голосов
/ 10 мая 2011

У меня проблема с регулярным выражением. Я играл с ним три часа и ничего не нашел работающего.

У меня есть этот текст:

Fax received from 45444849 ( 61282370000 )

И мне нужно извлечь число из скобок, чтобы я получил 61282370000. Если в скобках ничего нет (или только пробелы), то перед скобками должно быть число. Мне удалось только сделать это выражение, которое правильно берет число в скобках:

Fax received from .* \(\s([^)]*)\s\)$

Спасибо.

Ответы [ 5 ]

10 голосов
/ 10 мая 2011

Попробуйте регулярное выражение / (\ d +) (?! \ D * \ d +) / Использует отрицательный прогноз для захвата последнего числа в строке.

Например,

perl -le '$_="Fax received from 45444849 ( 61282370000 )"; /(\d+)(?!\D*\d+)/; print $1'

даст вам 61282370000. Однако

perl -le '$_="Fax received from 45444849 (  )"; /(\d+)(?!\D*\d+)/; print $1'

даст 45444849 в 1

1 голос
/ 10 мая 2011

Если это - perl, вам не нужно выполнять логику выбора в регулярном выражении. Вам просто нужно захватить оба и выбрать, например, так:

my $number = List::Util::first { $_; } m/(\d{7,})\s*[(]\s*(\d{7,})?\s*[)]/;
# deal with $number...
1 голос
/ 10 мая 2011

В Oracle PL / SQL я должен написать следующее:

SELECT TRIM (
          REPLACE (
             REPLACE (
                REGEXP_REPLACE (
                   'Fax received from 323 ( 123 )',
                   '[ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*( [0123456789]* )',
                   '',
                   1,
                   1,
                   'cm'),
                ')',
                ''),
             '(',
             ''))
  FROM DUAL;

Результат выражения SELECTed равен 123.

1 голос
/ 10 мая 2011

псевдокод ...

if str.match("\(\s*(\d+)\s*\)") 
   return str.matches("\(\s*(\d+)\s*\)")[0]
else
   return str.matches("(\d+)")[0]
1 голос
/ 10 мая 2011

Вы должны попытаться сопоставить оба ... затем используйте if ... предположим, что данные находятся в $line ...

$line =~ /Fax\sreceived.+?(\d+)\s+\(\s*(\S+)?\s+\)/;
if ($2) {$result= $2;} else {$result= $1;}

Примеры ...

$line1 = "Fax received from 45444849 ( 61282370000 )";
$line1 =~ /Fax\sreceived.+?(\d+)\s+\(\s*(\S+)?\s+\)/;
if ($2) {$result= $2;} else {$result= $1;}
print "result1: $result\n";

$line2 = "Fax received from 95551212 ( )";
$line2 =~ /Fax\sreceived.+?(\d+)\s+\(\s*(\S+)?\s+\)/;
if ($2) {$result= $2;} else {$result= $1;}
print "result2: $result\n";

Запуск, который дает ...

[mpenning@Bucksnort ~]$ perl fax.pl
result1: 61282370000
result2: 95551212
[mpenning@Bucksnort ~]$
...