2012-05-05 19 views
5

Say mam tekst podobny do poniższego tekstu zaznaczonego kursorem:Usuń pojedyncze podziały wierszy, zachować „pustych” linie

This is a test. 
This 
is a test. 

This is a test. 
This is a 
test. 

chciałbym przekształcić go:

This is a test. This is a test 

This is a test. This is a test 

w innych słowa, chciałbym zastąpić przerwy pojedynczej linii spacjami, pozostawiając puste linie samodzielnie.

myślałem, coś jak poniżej będzie działać:

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

Ale tak nie jest. Jeśli zastosuję go do powyższego tekstu, otrzyma:

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

, która również usunęła "pustą linię" w środku. Nie tego chcę.

Dla wyjaśnienia: Poprzez pustej linii rozumiem każdą linię z „białych” znaków (na przykład kart lub spacji)

jakieś przemyślenia, jak to zrobić?

Odpowiedz

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

Kiedy uruchomić ten skrypt usuwa tekst (czyli 'Clipboard' jest przypisany pusty ciąg) –

+0

tak ... rozwiązanie jest incorect, lekceważyć. Miał nawias niedopasowania, ale to nie było to. Problem polegał na tym, że możesz mieć puste przestrzenie przed końcem linii. Mam problemy z implementacją tego właśnie z regex :) – mihai

1

Wierzę, że to będzie działać:

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

To będzie rozebrać jednej linii łamie zakładając nową linię tokenu zawiera albo CR lub LF na końcu (np CR, LF, CR+LF, LF+CR). Nie liczy białych znaków jako pustych.

Twoim głównym problemem było stosowanie \R:

\ R wewnątrz klasy postaci jest tylko litera "R" [source]

Rozwiązaniem jest użycie CR i LF znaki bezpośrednio.


celu wyjaśnienia: pustą pierwszej linii, oznacza każdą linię znaków „bieli” (np klapki lub spacji)

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

To samo jak powyższy, ale liczy puste spacje jako puste. Działa, ponieważ akceptuje wszystkie znaki, z wyjątkiem łamania wierszy (*?), aż do pierwszej, nie znajdującej się pod znakiem, zarówno za, jak i przed liniami podziału, ponieważ . domyślnie nie pasuje do podziałów linii.


Chciałbym wymienić pojedyncze podziały wierszy spacjami, pozostawiając sam pustych linii.

Jeśli chcesz wymienić podział wiersza ze spacjami, to jest bardziej odpowiedni:

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

ten zastąpi pojedyncza linia zrywa z przestrzeni.


A jeśli chciał użyć lookbehinds i lookaheads:


Strip pojedyncze podziały wierszy:

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


Wymień jedną linię przerw ze spacjami:

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

Dla jakiś powód, \S nie wydaje się w ork w lookbehinds i uprzedzeniach. Przynajmniej nie z moimi testami.

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 
Powiązane problemy