2016-05-11 32 views
6

Si consideri il seguente espressione regolare:Come usare condizionali in caso di sostituzione in Notepad ++ tramite espressioni regolari

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

Se il testo è: a/b i gruppi di cattura saranno:

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

E se il il testo è: aa/b i gruppi di cattura 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), I ante c.

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

Io uso la seguente espressione regolare per la sostituzione:

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

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

+0

Penso che il vostro posizionamento del '?' Può essere corretto e questo potrebbe essere il motivo per Notepad ++ li tratta come letterali. –

risposta

7

La sintassi nella sostituzione condizionale è

(?{GROUP_MATCHED?}REPLACEMENT_IF_YES:REPLACEMENT_IF_NO} 

Il { e } sono necessari per evitare ambiguità quando avete a che fare con i gruppi superiori a 9 e con i gruppi di cattura denominati.

Da Notepad ++ utilizza Boost-Extended Format String Syntax, vedono questo Boost documentation:

Il carattere ? inizia un'espressione condizionale, la forma generale è:

?Ntrue-expression:false-expression

dove N è cifra decimale.

Se la sottoespressione N corrispondeva, quindi true-expression viene valutata e inviata all'output, altrimenti false-expression viene valutata e inviata all'output.

Normalmente è necessario circondare un'espressione condizionale con parentesi per evitare ambiguità.

Ad esempio, la stringa di formato (?1foo:bar) sostituirà ogni corrispondenza trovata con foo se il sub-espressione $1 stato abbinato, e con bar altrimenti.

Per sub-espressioni con un indice superiore a 9, o per l'accesso al nome sottoespressioni uso:

?{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 è stato inserito il ? quantificatore all'interno del gruppo di cattura, rendendo il modello all'interno del gruppo facoltativo, ma non l'intero gruppo. Ciò ha reso il gruppo sempre "partecipe alla partita", e la condizione sarebbe sempre "vera" (sempre abbinata). ? dovrebbe quantificare il gruppo.

enter image description here

+0

Si può anche collegare alla documentazione (se presente) specifica per Notepad ++? – CinCout

+1

Ho incluso il riferimento Boost. –

+0

Grazie mille – CinCout

Problemi correlati