Come utilizzare i condizionali durante la sostituzione in Notepad ++ tramite regex

Considera la seguente espressione regolare:

([a-zA-Z])([a-zA-Z]?)/([a-zA-Z])([a-zA-Z]?)

Se il testo è: a/b i gruppi che catturano saranno:

 /1 'a' /2 '' /3 'b' /4 '' 

E se il testo è: aa/b i gruppi che catturano saranno:

 /1 'a' /2 'a' /3 'b' /4 '' 

Supponiamo, voglio trovare e sostituire questa stringa in Notepad ++ in modo tale che se /2 o /4 sono vuoti (come nel primo caso sopra), prendo in considerazione c .

Quindi, il testo a/b diventa ca/cb . E il testo aa/b diventa aa/cb

Io uso il seguente regex per la sostituzione:

 (?(2)\1\2|0\1)/(?(4)\3\4|0\3) 

Ma Notepad ++ sta trattando ? letteralmente in questo caso, e non come identificatore condizionale. Qualche idea su cosa sto sbagliando?

La syntax nella sostituzione condizionale è

 (?{GROUP_MATCHED?}REPLACEMENT_IF_YES:REPLACEMENT_IF_NO} 

I { e } sono necessari per evitare ambiguità quando si gestiscono gruppi superiori a 9 e con gruppi di cattura nominati.

Dal momento che Notepad ++ utilizza la Boost-Extended Format String Syntax , vedere questa documentazione Boost :

Il personaggio ? inizia un’espressione condizionale, la forma generale è:

?Ntrue-expression:false-expression

dove N è una cifra decimale.

Se la sotto-espressione N stata abbinata, l’ true-expression viene valutata e inviata all’output, altrimenti viene valutata l’ false-expression e inviata all’output.

Normalmente dovrai circondare un’espressione condizionale con parentesi per evitare ambiguità.

Ad esempio, la stringa di formato (?1foo:bar) sostituirà ogni corrispondenza trovata con foo se la sottoespressione $1 stata abbinata, e con la bar contrario.

Per le sottoespressioni con un indice maggiore di 9 o per l’accesso alle sottoespressioni nominate utilizzare:

?{INDEX}true-expression:false-expression

o

?{NAME}true-expression:false-expression

Quindi, utilizzare ([a-zA-Z])([a-zA-Z])?/([a-zA-Z])([a-zA-Z])? e sostituire con (?{2}$1$2:c$1)/(?{4}$3$4:c$3) .

Il secondo problema è che hai inserito il ? quantificatore all’interno del gruppo che cattura, rendendo il modello all’interno del gruppo opzionale, ma non l’intero gruppo . Ciò ha reso il gruppo sempre “partecipante alla partita”, e la condizione sarebbe sempre “vera” (sempre abbinata). ? dovrebbe quantificare il gruppo .

inserisci la descrizione dell'immagine qui