Regex to change the number of spaces in an indent level

后端 未结 4 2056
天命终不由人
天命终不由人 2021-02-12 23:54

Let\'s say you have some lines that look like this

1  int some_function() {
2    int x = 3;  // Some silly comment

And so on. The indentation i

相关标签:
4条回答
  • 2021-02-13 00:18

    I needed to halve the amount of spaces on indentation. That is, if indentation was 4 spaces, I needed to change it to 2 spaces. I couldn't come up with a regex. But, thankfully, someone else did:

    //search for
    ^( +)\1 
    //replace with (or \1, in some programs, like geany)
    $1 
    

    From source: "^( +)\1 means "any nonzero-length sequence of spaces at the start of the line, followed by the same sequence of spaces. The \1 in the pattern, and the $1 in the replacement, are both back-references to the initial sequence of spaces. Result: indentation halved."

    0 讨论(0)
  • 2021-02-13 00:23

    Here's another one, instead utilizing \G which has NET, PCRE (C, PHP, R…), Java, Perl and Ruby support:

    s/(^|\G) {2}/   /g
    

    \G [...] can match at one of two positions:
    ✽ The beginning of the string,
    ✽ The position that immediately follows the end of the previous match.

    Source: http://www.rexegg.com/regex-anchors.html#G

    We utilize its ability to match at the position that immediately follows the end of the previous match, which in this case will be at the start of a line, followed by 2 whitespaces (OR a previous match following the aforementioned rule).

    See example: https://regex101.com/r/qY6dS0/1

    0 讨论(0)
  • 2021-02-13 00:29

    In some regex flavors, you can use a lookbehind:

    s/(?<=^ *)  /   /g
    

    In all other flavors, you can reverse the string, use a lookahead (which all flavors support) and reverse again:

     s/  (?= *$)/   /g
    
    0 讨论(0)
  • 2021-02-13 00:33

    You can try this:

    ^(\s{2})|((?<=\n(\s)+))(\s{2})
    

    Breakdown:

    ^(\s{2})  = Searches for two spaces at the beginning of the line
    ((?<=\n(\s)+))(\s{2}) = Searches for two spaces
        but only if a new line followed by any number of spaces is in front of it.
        (This prevents two spaces within the line being replaced)
    

    I'm not completely familiar with perl, but I would try this to see if it work:

    s/^(\s{2})|((?<=\n(\s)+))(\s{2})/\s\s\s/g
    

    As @Jan pointed out, there can be other non-space whitespace characters. If that is an issue, try this:

    s/^( {2})|((?<=\n( )+))( {2})/   /g
    
    0 讨论(0)
提交回复
热议问题