Regular expression to match single bracket pairs but not double bracket pairs

后端 未结 2 1372
盖世英雄少女心
盖世英雄少女心 2021-01-19 12:11

Is it possible to make a regular expression to match everything within single brackets but ignore double brackets, so for example in:

{foo} {bar} {{baz}}


        
相关标签:
2条回答
  • 2021-01-19 12:47

    To only match foo and bar without the surrounding braces, you can use

    (?<=(?<!\{)\{)[^{}]*(?=\}(?!\}))
    

    if your language supports lookbehind assertions.

    Explanation:

    (?<=      # Assert that the following can be matched before the current position
     (?<!\{)  #  (only if the preceding character isn't a {)
    \{        #  a {
    )         # End of lookbehind
    [^{}]*    # Match any number of characters except braces
    (?=       # Assert that it's possible to match...
     \}       #  a }
     (?!\})   #  (only if there is not another } that follows)
    )         # End of lookahead
    

    EDIT: In JavaScript, you don't have lookbehind. In this case you need to use something like this:

    var myregexp = /(?:^|[^{])\{([^{}]*)(?=\}(?!\}))/g;
    var match = myregexp.exec(subject);
    while (match != null) {
        for (var i = 0; i < match.length; i++) {
            // matched text: match[1]
        }
        match = myregexp.exec(subject);
    }
    
    0 讨论(0)
  • 2021-01-19 12:57

    In many languages you can use lookaround assertions:

    (?<!\{)\{([^}]+)\}(?!\})
    

    Explanation:

    • (?<!\{): previous character is not a {
    • \{([^}]+)\}: something inside curly braces, e.g. {foo}
    • (?!\}): following character is not a }
    0 讨论(0)
提交回复
热议问题