括弧のバランスをとった正規表現 質問する

括弧のバランスをとった正規表現 質問する

2 つの外側の括弧の間のすべてのテキストを選択するには、正規表現が必要です。

例:
START_TEXT(text here(possible text)text(possible text(more text)))END_TXT
^ ^

結果:
(text here(possible text)text(possible text(more text)))

ベストアンサー1

クイックリファレンスとしてこの回答を追加したいと思います。お気軽に更新してください。


.NET正規表現の使用バランスグループ:

\((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!))\)

c深度カウンターとして使用される場所。

Regexstorm.com のデモ


PCREを使用した再帰パターン:

\((?:[^)(]+|(?R))*+\)

regex101 のデモ; または交互に使用しない場合:

\((?:[^)(]*(?R)?)*+\)

regex101 のデモ; または展開されたパフォーマンスについて:

\([^)(]*+(?:(?R)[^)(]*)*+\)

regex101 のデモ(?R);を表すパターンが貼り付けられます(?0)

Perl、PHP、Notepad++、 R :パール=TRUEPython :PyPI 正規表現モジュールPerl の動作(?V1)にはを使用します。(PyPI 正規表現パッケージの新しいバージョンでは、すでにこれがデフォルトになっています →
DEFAULT_VERSION = VERSION1


Rubyを使用した部分式呼び出し:

Ruby 2.0 では\g<0>完全なパターンを呼び出すために使用できます。

\((?>[^)(]+|\g<0>)*\)

Rubularでのデモ; Ruby 1.9では、キャプチャグループ再帰:

(\((?>[^)(]+|\g<1>)*\))

Rubularでのデモ  (原子グループRuby 1.9.3 以降)


JavaScript  API :: XRegExp.matchRecursive

XRegExp.matchRecursive(str, '\\(', '\\)', 'g');

Java : 興味深い@jaytea による前方参照を使用するアイデア


再帰なしで最大 3 レベルのネストが可能:
(JS、Java、その他の正規表現)

防止するために逃げる 不均衡な場合、一番*内側のみ[)(]

\((?:[^)(]|\((?:[^)(]|\((?:[^)(]|\([^)(]*\))*\))*\))*\)

regex101 のデモ; または展開されたパフォーマンス向上のため(推奨)。

\([^)(]*(?:\([^)(]*(?:\([^)(]*(?:\([^)(]*\)[^)(]*)*\)[^)(]*)*\)[^)(]*)*\)

regex101 のデモ; もっと深くネストを追加する必要がある要求に応じ。

// JS-Snippet to generate pattern
function generatePattern()
{
  // Set max depth & pattern type
  let d = document.getElementById("maxDepth").value;
  let t = document.getElementById("patternType").value;
  
  // Pattern variants: 0=default, 1=unrolled (more efficient)
  let p = [['\\((?:[^)(]|',')*\\)'], ['\\([^)(]*(?:','[^)(]*)*\\)']];
  
  // Generate and display the pattern
  console.log(p[t][0].repeat(d) + '\\([^)(]*\\)' + p[t][1].repeat(d));
} generatePattern();
Max depth = <input type="text" id="maxDepth" size="1" value="3"> 
<select id="patternType" onchange="generatePattern()">
  <option value="0">default pattern</option>
  <option value="1" selected>unrolled pattern</option>
</select>
<input type="submit" onclick="generatePattern()" value="generate!">


参考 - この正規表現はどういう意味ですか?

おすすめ記事