Sto imparando espressioni regolari e ho una domanda.
Diciamo che ho la seguente balise xml.
<xml x="5"/>
Si può dire il valore di x foo
o bar
, quindi posso avere
<xml foo="6"/>
<xml bar="7"/>
Ho fatto un'espressione regolare per abbinare questa espressione durante la lettura del mio file e catturare il valore tra virgolette.
print $1."n" if /<xmls(?:foo|bar)="(d+)"/>/;
E l'output è
6
7
Ora la mia domanda è: c'è un modo per sapere se lo fosse neanche foo
o bar
che ha fatto corrispondere l'espressione regolare?
Lo sto chiedendo perché ho due array quando devo inserire uno dei valori di foo
e nell'altro i valori di bar
Potrei fare:
push @fooValues, $1 if /<xmlsfoo="(d+)"/>/;
push @barValues, $1 if /<xmlsbar="(d+)"/>/;
Ma sento che non è la strada da percorrere, quindi è per questo che mi chiedo se c'è un modo per sapere a quale gruppo corrisponde.
risposte:
1 per risposta № 1Basta usare un gruppo di acquisizione anziché un gruppo di acquisizione:
print "$1 - $2n" if m{<xmls(foo|bar)="(d+)"/>};
Ovviamente, devi usare alcuni dati falsi per imparare le espressioni regolari, ma spero che alla fine ti renderai conto che un vero parser XML è lo strumento migliore per lavorare con XML, e non con regex.
1 per risposta № 2
Il tuo problema è che stai usando il costrutto non-cattura, (?:...)
. Se usi semplicemente le parentesi per creare un normale gruppo di acquisizione, avrai una delle due foo
o bar
in $1
e il numero in $2
. Quindi puoi semplicemente controllare il valore di $1
e gestire il numero in modo appropriato.
Puoi persino usare un hash per memorizzare i valori:
$vals[$1] = $2
(Inoltre, inserisci un avviso standard sull'analisi di xml con regex. Detto questo, se lo sei certo che i costrutti xml che verranno analizzati sono limitati ad alcuni sottoinsiemi semplici e noti del linguaggio xml, regex potrebbe funzionare correttamente.)