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
深度カウンターとして使用される場所。
- Stack Overflow : 正規表現を使用して一致括弧のバランスをとる
- Wes のパズルブログ: .NET 正規表現によるバランスのとれた構造のマッチング
- Greg Reinacker のブログ: 正規表現におけるネストされた構造
PCREを使用した再帰パターン:
\((?:[^)(]+|(?R))*+\)
regex101 のデモ; または交互に使用しない場合:
\((?:[^)(]*(?R)?)*+\)
regex101 のデモ; または展開されたパフォーマンスについて:
\([^)(]*+(?:(?R)[^)(]*)*+\)
regex101 のデモ(?R)
;を表すパターンが貼り付けられます(?0)
。
Perl、PHP、Notepad++、 R :パール=TRUE、Python :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!">