Remove single line breaks, keep "empty" lines
autohotkey, regex
Solution
RegExReplace(Clipboard, "([^\r\n])\R(?=[^\r\n])", "$1$2")
This will strip single line breaks assuming the new line token contains either a `CR` or a `LF` at the end (e.g. `CR`, `LF`, `CR+LF`, `LF+CR`). It does not count whitespace as empty.
Your main problem was the use of `\R`:
\R inside a character class is merely the letter "R" [source]
The solution is to use the `CR` and `LF` characters directly.
To clarify: By an empty line I mean any line with "white" characters (e.g. tabs or white spaces)
RegExReplace(Clipboard, "(\S.*?)\R(?=.*?\S)", "$1")
This is the same as the above one, but counts whitespace as empty. It works because it accepts all characters except line breaks non-greedily (`*?`) up to the first non-whitespace character both behind and in front of the linebreaks, since the `.` does not match line breaks by default.
A lookahead is used to avoid 'eating' (matching) the next character, which can break on single-character lines. Note that since it is not matched, it is not replaced and we can leave it out of the replacement string. A lookbehind cannot be used because PCRE does not support variable-length lookbehinds, so a normal capture group and backreference are used there instead.
I would like to replace single line breaks by spaces, leaving empty lines alone.
If you want to replace the line break with spaces, this is more appropriate:
RegExReplace(Clipboard, "(\S.*?)\R(?=.*?\S)", "$1 ")
This will replace single line breaks with a space.
And if you wanted to use lookbehinds and lookaheads:
Strip single line breaks:
RegExReplace(Clipboard, "(?<=[^\r\n\t ][^\r\n])\R(?=[^\r\n][^\r\n\t ])", "")
Replace single line breaks with spaces:
RegExReplace(Clipboard, "(?<=[^\r\n\t ][^\r\n])\R(?=[^\r\n][^\r\n\t ])", " ")
For some reason, `\S` doesn't seem to work in lookbehinds and lookaheads. At least, not with my testing.
Problem
Say I have text like the following text selected with the cursor: ``` This is a test. This is a test. This is a test. This is a test. ``` I would like to transform it into: ``` This is a test. This is a test This is a test. This is a test ``` In other words, I would like to replace single line breaks by spaces, leaving empty lines alone. I thought something like the following would work: ``` RemoveSingleLineBreaks() { ClipSaved := ClipboardAll Clipboard = send ^c Clipboard := RegExReplace(Clipboard, "([^(\R)])(\R)([^(\R)])", "$1$3") send ^v Clipboard := ClipSaved ClipSaved = } ``` But it doesn't. If I apply it to the text above, it yields: ``` This is a test. This is a test. This is a test. This is a test. ``` which also removed the "empty line" in the middle. This is not what I want. To clarify: By an empty line I mean any line with "white" characters (e.g. tabs or white spaces) Any thoughts how to do this?