Tengo un bloque de texto donde las comillas de apertura y cierre son las mismas
"¿Hola, qué tal? "Hola"... "Algo más de texto" y algo más "aquí".
Tenga en cuenta que el carácter de comillas es " y no " " estos caracteres
(["'])(?:(?=(\\?))\2.)*?\1Quiero reemplazar el carácter de apertura " como "
ahora se verá como "Hola", ¿Cómo estás? "Hola"... "Algo más de texto" y algo más "aquí".
y luego de nuevo corriendo puedo simplemente encontrar y reemplazar la "ocurrencia como" sobrante
y eso daría el resultado esperado que debería verse como
"¿Hola, qué tal? “Hola”... “Más texto” y más “aquí”.
Preferiría la solución proporcionada por @WiktorStribiżew en un comentario sobre la pregunta, pero deseo brindar una solución alternativa que puede ser de interés para algunos lectores.
El segundo reemplazo de las comillas dobles restantes (posteriores) (es decir, ASCII 32) es sencillo, por lo que no lo discutiré.
Podría hacer coincidir las comillas dobles iniciales con la siguiente expresión regular y luego reemplazar cada coincidencia con “ :
"(?=(?:(?:[^"]*"){2})*[^"]*"[^"]*$)Esta expresión regular se basa en la observación de que queremos identificar todas las comillas dobles seguidas más adelante en la cadena por un número impar de comillas dobles (suponiendo que la cadena contiene un número par de comillas dobles).
La expresión regular se puede dividir de la siguiente manera.
" # match a double-quote (dq) (?= # begin a positive lookahead (?: # begin a non-capture group (?: # begin a non-capture group [^"]*" # match 0+ chars other than dq then match dq ){2} # end non-capture group and execute it twice )* # end non-capture group and execute it 0+ times [^"]*"[^"]* # match dq preceded and followed by 0+ non-dq chars $ # match end of string ) # end positive lookaheadSi el conjunto de datos es grande, puede ser recomendable realizar una evaluación comparativa para ver si la velocidad de ejecución es satisfactoria.