假设我有使用光标选择以下文本的文本:
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)
这也删除了中间的"空行".这不是我想要的.
为了澄清:由空行我指的是"白"字的任何行(如制表符或空格)
有什么想法怎么做?
RegExReplace(Clipboard, "([^\r\n])\R(?=[^\r\n])", "$1$2")
Run Code Online (Sandbox Code Playgroud)
这将去除单个换行假定令牌包含任一新行CR或LF在末端(例如CR,LF,CR+LF,LF+CR)。它不将空格视为空白。
您的主要问题是使用\R:
字符类中的\ R只是字母“ R” [源]
解决方案是直接使用CR和LF字符。
需要说明的是:空行是指任何带有“白色”字符的行(例如,制表符或空白)
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似乎无法在先行和先行中使用。至少不是我的测试。
| 归档时间: |
|
| 查看次数: |
2605 次 |
| 最近记录: |