Справка по регулярным выражениям в Perl - PullRequest
0 голосов
/ 13 февраля 2012

У меня следующий текстовый шаблон

(2222) First Last (ab-cd/ABC1), <first.last@site.domain.com> 1224: efadsfadsfdsf

(3333) First Last (abcd/ABC12), <first.last@site.domain.com> 1234, 4657: efadsfadsfdsf

Я хочу число 1224 или 1234, 4657 из вышеприведенного текста после текста >.

У меня есть \((\d+)\)\s\w*\s\w*\s\(\w*\/\w+\d*\),\s<\w*\.\w*\@\w*\.domain.com>\s\d+:, который будет принимать текст до : Но я хочу, чтобы текст после электронной почты до :

Есть ли какое-нибудь простое регулярное выражение, чтобы сделать это?или я должен использовать split и сделать это

Спасибо

Редактировать: весь текст возвращается инструментом командной строки.

(3333) First Last (abcd/ABC12), <first.last@site.domain.com> 1234, 4657: efadsfadsfdsf

(3333) - уникальный идентификатор

First Last - имена и фамилии

<first.last@site.domain.com> - адрес электронной почтыв формате FirstName.LastName@sub.domain.com

1234, 4567 - основные ключи базы данных

: xxxx - заголовок

Что мне нужно сделать, это обработать вышеизложенное и получить идентификатор базы данных hte (например: 1234, 4567 (2 отдельных идентификатора) и запрос к таблицам

Выше приведен вывод (например, я получу много записей) из инструмента, который я вызываю через мой Perl-скрипт.

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

Ответы [ 4 ]

1 голос
/ 13 февраля 2012

Ну, простое решение - просто разрешить все возможные символы в классе символов. То есть измените \d на [\d, ], чтобы разрешить цифры, запятые и пробел.

Однако ваше регулярное выражение не соответствует первой строке образца, поскольку содержит тире - (ab-cd/ABC1 не соответствует \w*\/\w+\d*\). Кроме того, не стоит слишком сильно полагаться на квантификатор *, поскольку он соответствует пустой строке (соответствует нулю или более раз) и должен использоваться только для тех вещей, которые действительно являются необязательными. В противном случае используйте +, что соответствует (1 или более раз).

У вас довольно строгое регулярное выражение, и с небольшими изменениями в ваших данных, таких как это, это не получится Только вы знаете, как выглядят ваши данные, и если вам действительно нужно строгое регулярное выражение. Однако, если ваши данные несколько непротиворечивы, вы можете использовать свободное регулярное выражение просто на основе части электронной почты:

sub extract_nums {
    my $string = shift;
    if ($string =~ /<[^>]*> *([\d, ]+):/) {
        return $1 =~ /\d+/g;   # return the extracted digits in a list
        # return $1;           # just return the string as-is
    } else { return undef }
}

Это предполагает, конечно, что у вас не может быть тегов <> перед частью электронной почты. Он будет захватывать любые цифры, запятые и пробелы, найденные между тегом <> и двоеточием, а затем возвращает список любых цифр, найденных в совпадении. Вы также можете просто вернуть строку, как показано в закомментированной строке.

1 голос
/ 13 февраля 2012

Вы можете выдумать вещи, которые вам не нужны, чтобы упростить выражение, скажем, просто «скомбинировать» части между круглыми скобками (и разделителями электронной почты), используя не жадные квантификаторы:

/(\d+)\).*?\(.*?\),\s*<.*?>\s*(\d+(?:,\s*\d+)*):/   (not tested!)

есть только две захваченные группы, (1234) и (1234, 4657), вторая, которую я могу только предположить из вашего паттерна для обозначения: «строка цифр, за которой следуют ноль или более строк цифр, разделенных запятыми».

0 голосов
/ 13 февраля 2012
$string =~ /.*>\s*(.+):.+/;
$numbers = $1;

Вот и все.Проверено.

С перехватом номера:

$string =~ /.*>\s*(?([0-9]|,)+):.+/;
$numbers = $1;

Не проверено, но вы поняли идею.

0 голосов
/ 13 февраля 2012

Кажется, что-то не хватает в ваших примерах.Это то, как они должны выглядеть с электронной почтой?

(1234) First Last (ab-cd/ABC1), <foo.bar@domain.com> 1224: efadsfadsfdsf

(1234) First Last (abcd/ABC12), <foo.bar@domain.com> 1234, 4657: efadsfadsfdsf

Если это так, это должно работать:

\((\d+)\)\s\w*\s\w*\s\(\w*\/\w+\d*\),\s<\w*\.\w*\@\w*\.domain\.com>\s\d+(?:,\s(\d+))?:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...