2012-05-05 5 views
5

Say Ho testo come il seguente testo selezionato con il cursore:Rimuovere le interruzioni linea singola, mantenere le linee "vuote"

This is a test. 
This 
is a test. 

This is a test. 
This is a 
test. 

Vorrei trasformarlo in:

This is a test. This is a test 

This is a test. This is a test 

Nell'altra parole, vorrei sostituire le interruzioni di riga singola per spazi, lasciando solo le righe vuote.

ho pensato qualcosa di simile alla seguente dovrebbe funzionare:

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

ma non è così. Se lo applico al testo sopra, produce:

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

che ha anche rimosso la "linea vuota" nel mezzo. Questo non è quello che voglio.

Per chiarire: Con riga vuota intendo qualsiasi linea con i caratteri "bianchi" (per esempio le schede o spazi bianchi)

tutti i pensieri come fare questo?

risposta

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

Quando eseguo questo, lo script cancella il testo (vale a dire 'Clipboard' viene assegnata una stringa vuota) –

+0

sì ... la soluzione è incorect, non tenerne conto. Aveva una parentesi errata, ma non era così. Il problema era che puoi avere spazi vuoti prima della fine della linea. Sto avendo problemi anche implementando questo solo con regex :) – mihai

1

ritengo questo funzionerà:

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") 

Questo eliminerà singola linea interruzioni assumendo il nuovo token linea contiene un CR o LF alla fine (es CR, LF, CR+LF, LF+CR). Non conta gli spazi vuoti come vuoto.

Il tuo problema principale era l'uso di \R:

\ R all'interno di una classe di caratteri è solo la lettera "R" [source]

La soluzione è quella di utilizzare il CR e LF personaggi direttamente.


Per chiarire: In una riga vuota intendo ogni linea con caratteri "bianche" (ad esempio tabulazioni o spazi bianchi)

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

Questo è lo stesso di quello superiore, ma conta gli spazi vuoti come vuoti. Funziona perché accetta tutti i caratteri tranne le interruzioni di riga non avidamente (*?) fino al primo carattere non di spazi vuoti sia dietro che davanti alle interruzioni di riga, poiché lo . non corrisponde alle interruzioni di riga per impostazione predefinita.


desidero sostituire interruzioni di linea singola da spazi, lasciando solo righe vuote.

Se si desidera sostituire l'interruzione di riga con gli spazi, questo è più appropriato:

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

Questo sostituirà singola linea rompe con uno spazio.


E se si voleva utilizzare lookbehinds e lookaheads:


Striscia singole interruzioni di riga:

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


Sostituire singola linea rompe con gli spazi:

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

Per qualche ragione, \S non sembra w ork in lookbehinds e lookaheads. Almeno, non con i miei test.

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