как получить внутренние значения из вложенных обратных ссылок Regex - PullRequest
1 голос
/ 02 декабря 2010

Я получаю данные от сервера следующим образом (пример входных данных):

[1284336000]: host1;event1;flag;state;counter;errors or warnings
[1284336000]: host2;event1;flag;state;counter;errors or warnings
[1284336000]: host1;event2;flag;state;counter;errors or warnings
[1284336000]: host2;event2;flag;state;counter;errors or warnings

Я должен сопоставить ввод и на основании совпадения создать переменную со значением hostname-eventname.

My Regex

^\[\d+\]:\s((host1);(event1)|(host2);(event2)|(host3);(event2)|(host2);(event1));(\w+);(\w+);(\d).+$

Я хочу отдельно указать имя хоста и событие в ссылочных переменных, таких как $2 или $3.

Например, рассмотрим этот ввод:

[1284336000]: host1;event1;flag;state;counter;errors or warnings

Мне нужно создать переменную с именем <hostname-eventname> в соответствии с именем хоста и именем события, полученным из вышеуказанного совпадения.

Say,

$myVar=$2-$3  (that is, $myVar=host1-event1)

Я не могу применить какую-либо операцию разделения. Так что без программирования: я могу только читать входные данные. И да, регулярное выражение относится к типу регулярных выражений Perl.

Не знаю, уточнил я свой запрос или нет?

Ответы [ 2 ]

4 голосов
/ 02 декабря 2010

Вы можете использовать

"^\[\d+\]:\s([^;]*);([^;]*)"

и иметь имя хоста и имя события в первых двух группах захвата.

3 голосов
/ 02 декабря 2010

Вам необходимо использовать оператор сброса ветви, (?|…|…|…):

^\[\d+\]:\s(?|(host1);(event1)|(host2);(event2)|(host3);(event2)|(host2);(event1));(\w+);(\w+);(\d).+$

Или более разборчиво:

m{
    ^ \[ \d+ \] : \s
    (?| (host1);(event1)  # $1, $2
      | (host2);(event2)  # $1, $2
      | (host3);(event2)  # $1, $2
      | (host2);(event1)  # $1, $2
    )
    ;
    (\w+);(\w+)           # $3, $4
    ; (\d)                # $5
    .+ $
}x
...