2012-05-05 45 views
5

说我有喜欢用光标选择下面的文本的文本:删除单个换行,保持“空”行

This is a test. 
This 
is a test. 

This is a test. 
This is a 
test. 

我想将其改造成:

This is a test. This is a test 

This is a test. This is a test 

在其他单词,我想用空格替换单行换行,单独留空行。

我觉得像下面将工作:

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

但事实并非如此。如果我将它应用到上面的文本,它会产生:

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

其中也删除了“空行”在中间。这不是我想要的。

澄清:空行我指的是“白色”字符(如制表符或空格)

任何思考任何线如何做到这一点?

回答

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

当我运行此,该脚本删除文本(即'Clipboard'被分配了一个空字符串) –

+0

是啊...解决的办法是incorect,忽略它。它有一个不匹配的括号,但那不是它。问题是你可以在行结束之前有空的空间。我遇到了麻烦以及与正则表达式:) – mihai

1

我相信这将工作:

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

打破假设新行令牌包含这​​会剥夺单行无论是CR或在最后一个LF(如CRLFCR+LFLF+CR)。它不会将空白计为空。

你的主要问题是使用\R

\字符类中,R是仅仅字母 “R” [source]

的解决方案是使用CRLF字符直接。


澄清:通过一个空行我的意思是与“白”字符的任何线(例如制表符或空格)

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

这是与上述相同之一,但将空白视为空白。它的工作原理是,除非换行符非贪婪地(*?)直到换行符后面和前面的第一个非空白字符,因为.默认情况下不匹配换行符。


我想用空格来代替单一的换行,只留下空行。

如果你想空格替换换行,这是比较合适的:

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

这将取代单一的线与空间打破。


如果你想使用lookbehinds和向前看符号:


条单行游:

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


更换单行打破了空间:

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

对于某种原因,\S似乎没有w在lookbeheads和lookaheads中使用ork。至少,不是与我的测试。

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