2012-05-05 16 views
5

Decir que tengo texto como el siguiente texto seleccionado con el cursor:Quitar saltos de línea individuales, mantener las líneas "vacías"

This is a test. 
This 
is a test. 

This is a test. 
This is a 
test. 

me gustaría transformarlo en:

This is a test. This is a test 

This is a test. This is a test 

En otra En palabras, me gustaría reemplazar los saltos de una sola línea por espacios, dejando las líneas vacías solo.

pensé algo como lo siguiente funcionaría:

RemoveSingleLineBreaks() 
{ 
    ClipSaved := ClipboardAll 
    Clipboard = 
    send ^c 
    Clipboard := RegExReplace(Clipboard, "([^(\R)])(\R)([^(\R)])", "$1$3")  
    send ^v 
    Clipboard := ClipSaved 
    ClipSaved = 
} 

pero no es así. Si lo aplico al texto anterior, se obtiene:

This is a test. This is a test. 
This is a test. This is a test. 

que también elimina la "línea vacía" en el medio. Esto no es lo que quiero.

Para aclarar: Por un línea vacía me refiero a cualquier línea con caracteres "blancos" (por ejemplo, fichas o espacios en blanco)

Cualquier pensamiento de cómo hacer esto?

Respuesta

1
Clipboard := RegExReplace(Clipboard, "(\S+)\R", "$1 ") 
+0

Cuando ejecuto esto, la secuencia de comandos elimina el texto (es decir, 'Clipboard' se le asigna una cadena vacía) –

+0

sí ... la solución es po, no tenerlo en cuenta. Tenía un paréntesis de desajuste, pero no era eso. El problema es que puede tener espacios vacíos antes del final de la línea. También estoy teniendo problemas para implementar esto solo con Regex :) – mihai

1

creo que esto funcionará:

text= 
(
This is a test. 
This 
is a test. 

This is a test. 
This is a 
test. 
) 
MsgBox % RegExReplace(text,"\S\K\v(?=\S)",A_Space) 
4
RegExReplace(Clipboard, "([^\r\n])\R([^\r\n])", "$1$2") 

Esto única tira saltos de línea suponiendo que el nuevo token línea contiene ya sea un CR o una LF en el extremo (por ejemplo CR, LF, CR+LF, LF+CR). No cuenta el espacio en blanco como vacío.

Su principal problema fue el uso de \R:

\ R dentro de una clase de caracteres no es más que la letra "R" [source]

La solución es utilizar el CR y LF personajes directamente.


Para aclarar: Por una línea vacía me refiero a cualquier línea con los caracteres "blancos" (por ejemplo, lengüetas o espacios en blanco)

RegExReplace(Clipboard, "(\S.*?)\R(.*?\S)", "$1$2") 

Esta es la misma que la anterior, pero cuenta el espacio en blanco como vacío. Funciona porque acepta todos los caracteres excepto los saltos de línea de forma no codiciosa (*?) hasta el primer carácter que no sea de espacio en blanco tanto detrás como delante de los saltos de línea, ya que el . no coincide con los saltos de línea de forma predeterminada.


quisiera sustituir saltos de línea individuales por espacios, dejando líneas vacías solo.

Si desea reemplazar el salto de línea con espacios, esto es más apropiado:

RegExReplace(Clipboard, "(\S.*?)\R(.*?\S)", "$1 $2") 

Esto reemplazará sola línea se rompe con un espacio.


Y si quieres usar lookbehinds y símbolos de anticipación:


sola tira saltos de línea:

RegExReplace(Clipboard, "(?<=[^\r\n\t ][^\r\n])\R(?=[^\r\n][^\r\n\t ])", "") 


Reemplazar sola línea rompe con espacios:

RegExReplace(Clipboard, "(?<=[^\r\n\t ][^\r\n])\R(?=[^\r\n][^\r\n\t ])", " ") 

Para alguna razón, \S no parece w ork en lookbehinds y lookaheads. Al menos, no con mi prueba.

1
#SingleInstance force 

#v:: 
    Send ^c 
    ClipWait 
    ClipSaved = %clipboard% 

    Loop 
    { 
     StringReplace, ClipSaved, ClipSaved, `r`n`r`n, `r`n, UseErrorLevel 
     if ErrorLevel = 0 ; No more replacements needed. 
      break 
    } 
    Clipboard := ClipSaved 
    return 
Cuestiones relacionadas