4

一重括弧内のすべてに一致するが、二重括弧を無視する正規表現を作成することは可能ですか?たとえば、次のようになります。

{foo} {bar} {{baz}}

foo と bar を一致させたいのですが、baz は一致させませんか?

4

2 に答える 2

9

周囲の中括弧なしでのみ一致foobarせるには、次を使用できます

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

言語が後読みアサーションをサポートしている場合。

説明:

(?<=      # 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

編集: JavaScript では、後読みはありません。この場合、次のようなものを使用する必要があります。

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);
}
于 2012-10-04T13:19:05.203 に答える
3

多くの言語で、ルックアラウンド アサーションを使用できます。

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

説明:

  • (?<!\{): 前の文字は{
  • \{([^}]+)\}: 中括弧内の何か、例えば{foo}
  • (?!\}): 次の文字は}
于 2012-10-04T13:17:12.447 に答える