none
正規表現で最短一致 RRS feed

  • 質問

  • はじめまして。

    VisualStudio2003(VB.NET)での正規表現で最短一致で文字列を取得するには

    STARThogehogeENDhogehogeSTARThogehogeEND

    上記の場合は、START.*?END で2組の結果が得られますが

    STARThogehogeSTARThogehogeENDhogehoge

    上記のような文字列ですと、1個目のSTARTからENDまでがマッチします。

    ここで、2個目のSTARTからENDまでをマッチさせたい場合はどのようにすればよいでしょうか?

    (STARThogehogeENDだけマッチさせたい)

    よろしくおねがいします。

    2006年12月8日 10:22

回答

  • 青柳です。

      "START(?:(?!START).)*END"
    というパターンで可能なようです。

    私もよく意味がわかっているわけではないのですが、
    グループ化構成体  http://msdn2.microsoft.com/ja-jp/library/bs2twtah(VS.80).aspx
    の (?!  ) で 「ある文字列を含まない文字列」 っていうのができると見た覚えがあったので、検索してみたところ
    http://www.din.or.jp/~ohzaki/regex.htm
    こちらで紹介されていました。(↑このページはすごいです)

    2006年12月12日 2:02
  • .netの正規表現では、可変の戻り読みが使えるので、

     

    Code Snippet
    (?<=START.*)(?<!START.*START.*)START.*?END

     

     

    とすれば、こんなパターンにも対応できるはずです。
    START111END222START333END444START555END

     

    黄緑がマッチします。

    START111END222START333END444START555END


    背後で、こんな数学を使ってたりする

    Xは1以上の自然数である。かつ、Xは2以上の自然数でない。 ⇔ X=1

    2008年5月25日 10:40
  •  Shinichi Aoyagi さんからの引用

    青柳です。

      

    Code Snippet
    "START(?:(?!START).)*END"

     

     

    というパターンで可能なようです。

     

    いいえ、違います。

     

    これだと

    2個目のSTARTからENDまでにマッチする正規表現ではなく、
    文字列ENDから左方向に文字列を見て、最初にあるSTARTまでにマッチする正規表現となります。

     

    2008年5月26日 10:45

すべての返信

  • 青柳です。

      "START(?:(?!START).)*END"
    というパターンで可能なようです。

    私もよく意味がわかっているわけではないのですが、
    グループ化構成体  http://msdn2.microsoft.com/ja-jp/library/bs2twtah(VS.80).aspx
    の (?!  ) で 「ある文字列を含まない文字列」 っていうのができると見た覚えがあったので、検索してみたところ
    http://www.din.or.jp/~ohzaki/regex.htm
    こちらで紹介されていました。(↑このページはすごいです)

    2006年12月12日 2:02
  • 青柳さん

    確かに "START(?:(?!START).)*END" で実現できました。

    (?! ) は、いまいち使い方が解らなかったのですが

    http://www.din.or.jp/~ohzaki/regex.htmhttp://www.din.or.jp/~ohzaki/regex.htm

    ↑のページで理解出来ました。

    参考になるリンクまで教えて頂きまして、ありがとうございました。

    2006年12月13日 8:22
  • .netの正規表現では、可変の戻り読みが使えるので、

     

    Code Snippet
    (?<=START.*)(?<!START.*START.*)START.*?END

     

     

    とすれば、こんなパターンにも対応できるはずです。
    START111END222START333END444START555END

     

    黄緑がマッチします。

    START111END222START333END444START555END


    背後で、こんな数学を使ってたりする

    Xは1以上の自然数である。かつ、Xは2以上の自然数でない。 ⇔ X=1

    2008年5月25日 10:40
  •  Shinichi Aoyagi さんからの引用

    青柳です。

      

    Code Snippet
    "START(?:(?!START).)*END"

     

     

    というパターンで可能なようです。

     

    いいえ、違います。

     

    これだと

    2個目のSTARTからENDまでにマッチする正規表現ではなく、
    文字列ENDから左方向に文字列を見て、最初にあるSTARTまでにマッチする正規表現となります。

     

    2008年5月26日 10:45
  • こんにちは! 中川 俊輔です。

     

    青柳さん、Aketi Jyuuzouさん、回答ありがとうございます。

     

    nitro31さん、フォーラムのご利用ありがとうございます。

    正規表現は奥が深いですね!

     

    有用な情報と思われたため、青柳さん、Aketi Jyuuzouさんの回答へ回答済みチェックをつけさせていただきました。

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    nitro31さんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    2008年6月18日 10:11