• ベストアンサー

正規表現 .+? と .++ と .+ の違いについて

正規表現でタグを除こうと思っています。 最初は任意の一文字の連続として <.+>でうまくいくと思ったのですが、これだと すべて取り除かれてしまいます。 何らかの一文字(の連続)が連続するとして、 <.++>としましたがこれだと何もマッチしません。 いろいろ調べて、 <.+?>だとうまくいきます。 なぜ最後のだけうまくいくのかよくわかりません。 最初の<.+>でうまくいけばわかりやすいのですが。 なにかアドバイスがありましたらお願いします。

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

どの正規表現を使用していますか。(perl,sed,等) それとも、Cのプログラムから正規表現ライブラリを使用しているのでしょうか。(C&C++のカテゴリへの投稿なので) 正規表現にも方言がありますので、まず、どの正規表現 をしようしているかを提示して下さい。(できればOSも。) また、やりたいことは <...任意の文字列...> を 両端の<>をとって ...任意の文字列... にしたいということでしょうか。

noname#11927
質問者

補足

JAVAやC#,phpなどを練習でやっていますが、 今回は、たまたまJAVAを使っています。 たとえば、<div id="div1">などを探し出して、 これを、なくしてしまいたいのです。 replaceAll("<.+>","")などとして、正規表現 を使います。 JAVA固有の問題でしたらすいません。以前 C言語で質問しましたので、こちらで質問させて もらいました。

その他の回答 (2)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

<div id="div1"> を div id="div1" にする方法ですが String st1 = "<div id=\"div\">"; System.out.println (st1); String st2 = st1.replaceAll("<(.*)>","$1"); System.out.println (st2); で可能です。 replacement は\1ではなく $1 を指定します。 このことは、JAVAのドキュメントには記述されていません。(ドキュメントの間違いかと思われます)

noname#11927
質問者

お礼

回答ありがとうございます。 いろいろ参考にして問題解決しました。

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.2

<b>ABC</b> というテキストに正規表現 <.+> をマッチさせると、. はすべての文字にマッチし、+ はそれの1回以上の繰り返しですから、. は b > A B C < / b と、これらの文字にすべてマッチします。 .++ は、任意の文字の1回以上の繰り返しの後に + が続いた文字列にマッチします。例えば、<AAL+> であればマッチするでしょう。言語によってはエラーになるかもしれません。 <.+?> は ? を付けることによって「最小マッチ」という条件が加わります。つまり、< がありその後に任意の文字が1つ以上続くんだが、最初に > が出てきたところまでにマッチします。逆に言うと ? を付けない + や * は「最長マッチ」ということです。 他には、<[^>]+> という正規表現も使えます。< の次に、> 以外の文字が1つ以上続いて > が続く文字列にマッチします。

noname#11927
質問者

お礼

「最小マッチ」参考になりました。 ありがとうございました。

関連するQ&A