Cómo usar condicionales cuando se reemplaza en Notepad ++ a través de regex

Considere la siguiente expresión regular:

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

Si el texto es: a/b los grupos de captura serán:

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

Y si el texto es: aa/b los grupos de captura serán:

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

Supongamos que quiero encontrar y reemplazar esta cadena en Notepad ++ de manera que si /2 o /4 están vacíos (como en el primer caso anterior), antepongo c .

Entonces, el texto a/b convierte en ca/cb . Y el texto aa/b convierte en aa/cb

Uso la siguiente expresión regular para reemplazar:

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

Pero Notepad ++ está tratando ? literalmente en este caso, y no como un identificador condicional. ¿Alguna idea de qué estoy haciendo mal?

La syntax en el reemplazo condicional es

 (?{GROUP_MATCHED?}REPLACEMENT_IF_YES:REPLACEMENT_IF_NO} 

Los { y } son necesarios para evitar la ambigüedad cuando trabajas con grupos de más de 9 y con grupos de captura nombrados.

Dado que Notepad ++ utiliza Boost-Extended Format String Syntax , consulte esta documentación de Boost :

El personaje ? comienza una expresión condicional, la forma general es:

?Ntrue-expression:false-expression

donde N es un dígito decimal.

Si la sub-expresión N se correspondió, entonces true-expression se evalúa y se envía a la salida, de lo contrario false-expression se evalúa y se envía a la salida.

Normalmente, deberá rodear una expresión condicional entre paréntesis para evitar ambigüedades.

Por ejemplo, la cadena de formato (?1foo:bar) reemplazará cada coincidencia encontrada con foo si la sub-expresión $1 coincidiera, y con la bar contrario.

Para las subexpresiones con un índice mayor que 9, o para el acceso a sub expresiones con nombre, use:

?{INDEX}true-expression:false-expression

o

?{NAME}true-expression:false-expression

Entonces, use ([a-zA-Z])([a-zA-Z])?/([a-zA-Z])([a-zA-Z])? y reemplace con (?{2}$1$2:c$1)/(?{4}$3$4:c$3) .

El segundo problema es que colocaste el ? cuantificador dentro del grupo de captura, lo que hace que el patrón dentro del grupo sea opcional, pero no para todo el grupo . Eso hizo que el grupo siempre “participara en el partido”, y la condición siempre sería “verdadera” (siempre coincide). ? debe cuantificar el grupo .

enter image description here