删除单个换行符,保留"空"行

Ame*_*ina 8 regex autohotkey

假设我有使用光标选择以下文本的文本:

This is a test. 
This 
is a test.

This is a test. 
This is a 
test.
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

This is a test. This is a test

This is a test. This is a test
Run Code Online (Sandbox Code Playgroud)

换句话说,我想用空格替换单个换行符,只留空行.

我认为以下内容可行:

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

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

This is a test. This is a test.
This is a test. This is a test.
Run Code Online (Sandbox Code Playgroud)

这也删除了中间的"空行".这不是我想要的.

为了澄清:空行我指的是"白"字的任何行(如制表符或空格)

有什么想法怎么做?

Bob*_*Bob 6

RegExReplace(Clipboard, "([^\r\n])\R(?=[^\r\n])", "$1$2")
Run Code Online (Sandbox Code Playgroud)

这将去除单个换行假定令牌包含任一新行CRLF在末端(例如CRLFCR+LFLF+CR)。它不将空格视为空白。

您的主要问题是使用\R

字符类中的\ R只是字母“ R” [源]

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


需要说明的是:空行是指任何带有“白色”字符的行(例如,制表符或空白)

RegExReplace(Clipboard, "(\S.*?)\R(?=.*?\S)", "$1")
Run Code Online (Sandbox Code Playgroud)

与上面的相同,但是将空格视为空白。之所以起作用,是因为它默认*?接受与换行符.不匹配的所有字符,除了换行符()以外,还可以换行符后面和前面的第一个非空白字符。

前瞻用于避免“吃”(匹配)下一个字符,该字符可能在单字符行上中断。请注意,由于不匹配,因此不会替换它,我们可以将其保留在替换字符串之外。由于PCRE不支持可变长度的lookbehinds,因此无法使用后向隐藏,因此在其中使用了常规捕获组和反向引用。


我想用空格替换单个换行符,而让空行独自呆着。

如果要用空格替换换行符,这更合适:

RegExReplace(Clipboard, "(\S.*?)\R(?=.*?\S)", "$1 ")
Run Code Online (Sandbox Code Playgroud)

这将用空格替换单个换行符。


而且,如果您想使用回首和提前行:


去除单个换行符:

RegExReplace(Clipboard, "(?<=[^\r\n\t ][^\r\n])\R(?=[^\r\n][^\r\n\t ])", "")
Run Code Online (Sandbox Code Playgroud)


用空格替换单个换行符:

RegExReplace(Clipboard, "(?<=[^\r\n\t ][^\r\n])\R(?=[^\r\n][^\r\n\t ])", " ")
Run Code Online (Sandbox Code Playgroud)

由于某种原因,\S似乎无法在先行和先行中使用。至少不是我的测试。


mih*_*hai 1

Clipboard := RegExReplace(Clipboard, "(\S+)\R", "$1 ")
Run Code Online (Sandbox Code Playgroud)