Come recuperare valori interni da Regex backreference nested
-
30-09-2019 - |
Domanda
Ricevo in ingresso dal server nel modo seguente (dati di input di esempio):
[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
devo abbinare l'ingresso e in base alla partita, creare una variabile con un valore di hostname-eventname
.
Il mio Regex
^\[\d+\]:\s((host1);(event1)|(host2);(event2)|(host3);(event2)|(host2);(event1));(\w+);(\w+);(\d).+$
Voglio il nome dell'host e l'evento separatamente in variabili di riferimento come $2
o $3
.
Per esempio, si consideri questo ingresso:
[1284336000]: host1;event1;flag;state;counter;errors or warnings
Ho bisogno di creare una variabile con un nome <hostname-eventname>
in base al nome host e eventName prelevato dalla partita di cui sopra.
Di ',
$myVar=$2-$3 (that is, $myVar=host1-event1)
Non è possibile applicare alcuna operazione di divisione oltre. Quindi, nessuna programmazione: posso leggere solo i dati di input. E sì, l'espressione regolare è di Perl tipo regex.
Non so se ho chiarito la mia domanda o no?
Soluzione
È necessario utilizzare l'operatore di filiale-reset, (?|…|…|…)
:
^\[\d+\]:\s(?|(host1);(event1)|(host2);(event2)|(host3);(event2)|(host2);(event1));(\w+);(\w+);(\d).+$
O, più leggibile:
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
Altri suggerimenti
È possibile utilizzare
"^\[\d+\]:\s([^;]*);([^;]*)"
e hanno l'host e nome dell'evento nei primi due gruppi di cattura.