/ / Conoscere quale espressione nel gruppo corrisponde - regex, perl

Conoscere quale espressione del gruppo corrisponde - regex, perl

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 № 1

Basta 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.)