Pregunta

Estoy usando Notepad ++ para hacer un reemplazo de texto en un archivo de idioma de 5453 filas. El formato de las filas del archivo es:

variable.name = Variable Value Over Here, that''s for sure, Really

El doble apóstrofe es intencional.

Necesito convertir el valor en mayúsculas y minúsculas, excepto por las palabras "Aquí" y "Realmente" que son apropiadas y deben permanecer en mayúsculas. Como puede ver, el caso dentro del valor generalmente se mezcla para comenzar.

He trabajado en esto por un tiempo. Todo lo que tengo hasta ahora es:

 (. )([A-Z])(.+)

que parece seleccionar al menos las cadenas adecuadas. La pieza de reemplazo es donde estoy luchando.

¿Fue útil?

Solución

El reemplazo de expresiones regulares no puede ejecutar la función (como mayúsculas) en las coincidencias. Tendrías que hacer un script que, p. en PHP o JavaScript.

Actualización: Consulte la respuesta de Jonas .

Creé una página web llamada Utilidades de texto para hacer ese tipo de cosas:

  • pegue su texto
  • ir " Buscar, regexp & amp; reemplazar " (o presione Ctrl + Shift + F )
  • ingrese su expresión regular (la mía sería ^ (. *? \ = \ s * \ w) (. *) $ )
  • compruebe los límites de línea de coincidencia " ^ $ " opción
  • elija " Aplicar la función JS a las coincidencias "
  • agregue argumentos (primero es la coincidencia, luego los subpatrones), aquí s, start, rest
  • cambie la declaración de retorno a return start + rest.toLowerCase ();

La función final en el área de texto se ve así:

return function (s, start, rest) {
     return start + rest.toLowerCase();
};

Tal vez agregue algún código para poner en mayúscula algunas palabras como " Really " y " Aquí " ;.

Otros consejos

Find:    (. )([A-Z])(.+)
Replace: \1\U\2\L\3

En Notepad ++ 6.0 o superior (que viene con PCRE integrado). p>

En Notepad ++ puede usar un complemento llamado PythonScript para hacer el trabajo. Si instala el complemento, cree un nuevo script de esta manera:

ingrese la descripción de la imagen aquí

Luego puede usar el siguiente script, reemplazando las expresiones regulares y de función como mejor le parezca:

import re

#change these
regex = r"[a-z]+sym"
function = str.upper

def perLine(line, num, total):
for match in re.finditer(regex, line):
    if match:
        s, e = match.start(), match.end()
        line = line[:s] + function(line[s:e]) + line[e:]
        editor.replaceWholeLine(num, line)

editor.forEachLine(perLine)

Este ejemplo particular funciona encontrando todas las coincidencias en una línea particular, luego aplicando la función cada coincidencia. Si necesita soporte multilínea, Python Script " Conext-Help " explica todas las funciones ofrecidas, incluidas las funciones pymlsearch / pymlreplace definidas bajo el objeto 'editor'.

Cuando esté listo para ejecutar su script, vaya primero al archivo en el que desea que se ejecute, luego vaya a " Scripts > " en el menú Python Script y ejecuta el tuyo.

Nota: aunque probablemente pueda usar la funcionalidad de deshacer de notepad ++ si comete un error, puede ser una buena idea poner el texto en otro archivo primero para verificar que funciona.

P.S. Puede 'encontrar' y 'marcar' cada aparición de una expresión regular utilizando el cuadro de diálogo de búsqueda incorporado de notepad ++, y si pudiera seleccionarlas todas, podría usar los '' Caracteres- > MAYÚSCULAS '' de TextFX. funcionalidad para este problema en particular, pero no estoy seguro de cómo pasar del texto marcado o encontrado al texto seleccionado. Pero, pensé que publicaría esto en caso de que alguien lo haga ...

Editar: en Notepad ++ 6.0 o superior, puede usar " PCRE (expresión regular compatible con Perl) Buscar / Reemplazar " (fuente: http://sourceforge.net/apps/mediawiki/notepad- plus /? title = Regular_Expressions ) Entonces esto podría haberse resuelto usando una expresión regular como (.) ([Az]) (. +) con un argumento de reemplazo como \ 1 \ U \ 2 \ 3 .

El interlocutor tenía un caso muy específico en mente. Como un cambio general a "caso de oración" en el bloc de notas ++ La primera sugerencia regexp no funcionó correctamente para mí. Si bien no es perfecto, aquí hay una versión ajustada que fue una gran mejora en el original para mis propósitos:

find:    ([\.\r\n][ ]*)([A-Za-z\r])([^\.^\r^\n]+) 
replace: \1\U\2\L\3

Todavía tiene un problema con nombres, minúsculas, nombres, fechas, países, etc., pero un buen corrector ortográfico puede ayudar con eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top