Remove single line breaks, keep “empty” lines

前端 未结 4 572
孤街浪徒
孤街浪徒 2020-12-19 04:06

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 wo

相关标签:
4条回答
  • 2020-12-19 04:51
    Clipboard := RegExReplace(Clipboard, "(\S+)\R", "$1 ")
    
    0 讨论(0)
  • 2020-12-19 04:56
    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.

    0 讨论(0)
  • 2020-12-19 05:00

    I believe this will work:

    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)
    
    0 讨论(0)
  • 2020-12-19 05:01
    #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
    
    0 讨论(0)
提交回复
热议问题