RegExReplace(Clipboard, "([^
])R(?=[^
])", "$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(?=[^
][^
])", "")
Replace single line breaks with spaces:
RegExReplace(Clipboard, "(?<=[^
][^
])R(?=[^
][^
])", " ")
For some reason, S
doesn't seem to work in lookbehinds and lookaheads. At least, not with my testing.