Giocando con le espressioni regolari, in particolare l'abbinamento bilanciato del sapore .NET, sono arrivato a un punto in cui mi sono reso conto che non capivo i meccanismi interni del motore come pensavo di fare. Apprezzerei qualsiasi input sul perché i miei schemi si comportano come fanno loro! Ma pugno ...In che modo i condizionali nei gruppi di ricerca funzionano in regex .NET?
Declinazione di responsabilità: Questa domanda è puramente teorica e qualsiasi risultato ottenuto qui non verrà mai utilizzato, né modificato e utilizzato nel codice di produzione per analizzare HTML. Mai. Lo prometto. Ho paura del pony. =)
Ora per il mio problema. Proverò ad abbinare la lettera A
, se non è preceduta da un #
. Per dimostrare, userò sempre la stringa ..A..#..A..
. Qui, il primo A
deve corrispondere. Ovviamente, questo è un compito abbastanza semplice usando "A(?<!^.*#.*)"
, ma qui desidero utilizzare i condizionali, poiché possono essere utilizzati per corrispondenze bilanciate e altre cose interessanti.
Quello che ho cercato è
"A(?<=^(#(?<q>)|[^#])*(?(q)(?!)))"
Il modo in cui io interpreto è: quando il motore encounteres una "A", si va indietro all'inizio della stringa, e per ogni personaggio aggiungere delle partite vuota il gruppo che cattura q se il personaggio è un #. Quindi dovrebbe fallire se q contiene una corrispondenza. Quello che non capisco è il motivo per cui questa espressione corrisponde sia come nella mia stringa di esempio.
Quando mi è sufficiente rimuovere il lookbehind e Match l'intera stringa, questo funziona:
"^(#(?<q>)|[^#])*(?(q)(?!))A"
corrisponde l'intera stringa fino al primo A, anche se quantificatore del primo gruppo è avido. L'inserimento di un "#" all'inizio causerà anche il fallimento della corrispondenza (come desiderato).
Quindi: come si guardano attorno i gruppi, i gruppi di cattura denominati al loro interno e le condizioni condizionali giocano insieme?
Grazie!
Modifica: Questo problema può essere visualizzato più facilmente in (?<=(?<q>)(?(q)(?!))).
, che non deve corrispondere a nessun carattere, ma corrisponde a tutto.
+1 e ho ricevuto solo per secondo comma finora./Ok, leggi il tutto, ma troppo male questo è molto specifico per C# e non posso contribuire ... ANCORA! Domanda preferita e segnalibro! – polygenelubricants
@polygenelubrificanti: Hehe, grazie! =) – Jens