• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:正規表現:対応する文字列A~文字列Bの検索(入れ子あり))

正規表現で文字列A~文字列Bの検索(入れ子あり)

このQ&Aのポイント
  • 正規表現を使用して、文字列A~文字列Bの間にあるテキストを検索する方法について教えてください。
  • 正規表現を再帰的に使用して、入れ子構造を持つカッコにマッチする方法を教えてください。
  • 文字列Aから文字列Bまでのテキストを抜き出すための正規表現のプログラム例を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

$re = qr/< (?(?=<|>)(??{$re})|.)* >/x; でどうだろうか.

TYWalker
質問者

お礼

うおーーー #! perl # betweenEntities -- &lt; から対応 &gt; までを抜く # 全角ブランクで字下げを表現しています。 $re = qr/&lt; (?(?=&lt;|&gt;)(??{$re})|.)* &gt;/x; while(<DATA>) {  chomp;  for (/$re/g) {   print "△$_△";  }  print "\n"; } __DATA__ I &lt;love&gt; you I &lt;love&gt; &lt;you&gt; &lt;I &lt;love&gt; &lt;you&gt;&gt; => >betweenEntities.pl △&lt;love&gt;△ △&lt;love&gt;△△&lt;you&gt;△ △&lt;I &lt;love&gt; &lt;you&gt;&gt;△ できますね!!! ありがとうございます。 明日ゆっくり解析&テストしようと思います。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

一応書いておくと, もとの正規表現が $re = qr/< (?:[^<>]|(??{$re}))* >/x; と等価なので, 区切りが 2文字以上になったときに (?:[^<>]|(??{$re})) をどうするか, もっというと [^<>] をどう処理するかという問題に落とすことができます. これは「開始の区切りである < もしくは終了の区切りである >」のいずれでもないもの, ということなので, これを 2文字以上のときにどう書くかという問題に帰着されます. で, 結局これが (?=&lt;|&gt;) を使って表せるぞ, ということで. ああ, (?:[^<>]|(??{$re})) に合わせるなら (?(?!&lt;|&gt;).|(??{$re})) の方が近いかも. あと, 開く記号と閉じる記号がちゃんとマッチしない (より正確には「開く方が多い」) 場合にどうなるかは試していないのでわかりません.

TYWalker
質問者

お礼

ありがとうございます。 昨日は &lt; を『に、&gt;を』に合わせて『から』までで変換するスクリプトを掛けて帰宅したんですが、今朝教えていただいたパターンと同じ結果を返すことが分かりました。 アサーションですね! これは大きく応用できそうです。 どうもありがとうございます。

関連するQ&A