2009-06-24 25 views
34

Estoy usando Notepad ++ para reemplazar texto en un archivo de 5453 filas. El formato de las filas del archivo es:Regex para cambiar a la frase

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

El doble apóstrofo es intencional.

Necesito convertir el valor en caso de oraciones, excepto las palabras "Aquí" y "Realmente" que son correctas y deben permanecer en mayúscula. 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 al menos seleccionar las cadenas adecuadas. La pieza de reemplazo es donde estoy luchando.

+7

¿Por qué son "Aquí" y "Realmente" apropiados? –

Respuesta

10

El reemplazo de regex no puede ejecutar la función (como el uso de mayúsculas) en las coincidencias. Tendría que guiar eso, p. en PHP o JavaScript.

Actualización: Ver Jonas' answer.

Yo mismo construí una página Web llamada Text Utilities a hacer ese tipo de cosas:

  • pegar el texto
  • ir en "Buscar, expresión regular & reemplazar" (o pulse Ctrl + Shift + F)
  • introduzca su expresión regular (el mío sería ^(.*?\=\s*\w)(.*)$)
  • verificación de la opción "límites^$ line partido"
  • elija "Aplicar la función JS para partidos"
  • añadir argumentos (primero es el partido, entonces los patrones sub), aquí s, start, rest
  • cambio de la instrucción de retorno a return start + rest.toLowerCase();

la función final en el área de texto tiene el siguiente aspecto:

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

tal vez añadir algo de código para capitalizar algunas palabras como "verdad" y "aquí".

+0

Gracias por la ayuda streetpc. En Notepad ++ puedo aplicar la función de reemplazo usando regex, que es suh-weet. Por otra parte, su sitio también es suh-weet. Esto casi lo clava a menos que tenga una nueva oración dentro de la porción variable, pero puedo solucionarlo encontrando ". [A-z]" y arreglando el caso en la primera letra siguiendo una combinación de período y espacio. Voy a dejar la pregunta abierta por un tiempo para ver si alguna persona de Notepad ++ responde pero definitivamente resolvió mi problema. ¡Gracias! – jkramp

+0

De nada :) –

+0

Esto se puede hacer en Vim. http://vim.wikia.com/wiki/Changing_case_with_regular_expressions – MaxH

6

En Notepad ++ puede usar un complemento llamado PythonScript para hacer el trabajo. Si instala el complemento, crear un nuevo guión de esta manera:

enter image description here

continuación, puede utilizar el siguiente script, en sustitución de las variables de expresiones regulares y funcionan 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 particular El ejemplo funciona al encontrar todas las coincidencias en una línea particular, luego aplica la función cada una de las coincidencias. Si necesita soporte multilínea, Python Script "Conext-Help" explica todas las funciones ofrecidas, incluidas las funciones pymlsearch/pymlreplace definidas en el objeto 'editor'.

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

Nota: Si bien es probable que puedas utilizar la funcionalidad de deshacer de notepad ++ si te equivocas, podría ser una buena idea poner primero el texto en otro archivo para verificar que funcione.

P.S. Puedes 'buscar' y 'marcar' cada aparición de una expresión regular usando el diálogo de búsqueda integrado de notepad ++, y si pudieras seleccionarlos todos podrías usar la funcionalidad "Caracteres-> MAYÚSCULO" de TextFX para este problema en particular, pero yo ' No estoy seguro de cómo pasar del texto marcado o encontrado al texto seleccionado. Sin embargo, pensé que iba a publicar esto en caso de que alguien lo hace ...

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

+0

Para aquellos que buscan una buena referencia a la sintaxis de búsqueda y sustitución de PCRE (incluida la conversión de casos, etc.), puede consultar este sitio de Perldoc: http://perldoc.perl.org/perlre.html - - ¡No pude encontrar ninguna otra ubicación donde cosas como '\ U' estuvieran documentadas! –

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

En Notepad ++ 6.0 o mejor (que viene con una función de apoyo PCRE).

+2

Oh wow, he querido algo como esto por tanto tiempo. ¡¡Gracias!! –

+24

Agregaré que '\ u' uppercases es el primer personaje del partido. Del mismo modo '\ l' minúscula solo el primer caracter. –

+6

Esta debería ser la respuesta. – sonnb

3

El que pregunta tenía un caso muy específico en mente. Como un "cambio de caso de sentencia" general en el bloc de notas ++ la primera sugerencia de expresión regular no funcionó correctamente para mí. aunque no es perfecto, aquí es una versión modificada, que era 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 

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

+0

gracias! \ U trabajado para mi Necesitaba cambiar un grupo de nombres de variables de guión bajo a camello, luego en sublime busqué en la expresión (. +) _ (. +) (<- esto no es un monstruo de ojos de bebé) y lo rellené con $ 1 \ U $ 2 – Eugenio