C#で正規表現を使用してのマッチがうまくいきません

このQ&Aのポイント
  • C#で正規表現を使用してのマッチがうまくいきません。タグを含む文字列から指定のパターンを抽出する際に、キャプチャの範囲指定に問題があります。
  • 具体的には、正規表現を使用して「<option value="1347">(.*?)</select></td>」というパターンを指定しましたが、同じパターンが複数回出現してしまい、不要な部分も抽出されてしまいます。
  • 「</select></td>」以降に指定できる文字がないため、最初に出現した位置までのキャプチャ範囲を指定し、2回目以降の出現は範囲外とする方法を教えてください。
回答を見る
  • ベストアンサー

c#で正規表現を使用してのmatchがうまくいきません。

c#で正規表現を使用してのmatchがうまくいきません。 例えば以下のようなタグがあったとします この6行をmatchの対象の文字列としたとします。(タグは適当です) ---------------------------------------- <select class="iiy_name_list"> <option value="1347">abc</option> </select></td> <select class="sug_name_list"> <option value="761">def</option> </select></td> ---------------------------------------- 2行目の"abc"を含む列が欲しかったので、以下のように正規表現にてキャプチャ範囲を指定 @"<option\s+value=""1347"">(.*)</select></td>", しかし、”(.*)”以降に指定した"</select></td>"というタグは match対象の全体分には2箇所全く同じ物があるため、2回目に出現した"</select></td>"まで読み込み、不必要なdefの行までも取得してしまいます。 "</select></td>"以外に正規表現で指定できる文字はありません、 ”(.*)”以降に指定した"</select></td>"が最初に出現した場所までをキャプチャし、2回目に出現してもキャプチャの範囲対象外にするには どのようにすればよいのでしょうか? よろしくお願いします。

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

  • ベストアンサー
回答No.1

.*を.*?にしてみてはどうでしょう。 .*は最長一致,.*?は最短一致になるはずです。 MSDN: 量指定子 http://msdn.microsoft.com/ja-jp/library/3206d374.aspx

master817199
質問者

お礼

ドンピシャな回答ありがとうございます。 見事解決しました。

その他の回答 (1)

  • Steeple
  • ベストアンサー率50% (2/4)
回答No.2

回答にならないかもしれませんが、XML関連するクラスで検索したほうがよさそうじゃないですか?

関連するQ&A

  • c#の正規表現がうまくいきません

    c#の正規表現がうまくいきません 以下のhtmlから指定の文字列を抜き取ります(htmlは適当です) ---------------------------------------- <select class="iiy_name_list"> <option value="1347">abc</option> </select></td> <select class="sug_name_list"> <option value="761">def</option> </select></td> ---------------------------------------- 2行目の"abc"、5行目の"def"の2つをキャプチャで得たいのですが、 @"<option\s+[^>]*>(.*)</select>",という指定では5行目の"def"しか得られません forを使って2回のループで一つ目の変数に"abc"二つ目の変数に"def"を入れるには どうしたらよいのでしょうか? 以下のページを参考にしたのですが、うまくいきません… http://uchukamen.com/Programming1/RegEx/index.htm よろしくお願いします。

  • マッチに関する正規表現

    $hoge = ’ <select name="a"> <option value="A" selected>■</option> <option value="B">★</option> <option value="C">▲</option> </select> <select name="b"> <option value="A">■</option> <option value="B">★</option> <option value="C" selected>▲</option> </select> ’; となっている場合、 『selected』が付いているoptionにマッチさせ、 そのvalue値【A】や【C】を$hoge1や$hoge2へ代入したいのですが、正規表現はどのようになるのでしょうか? $hoge =~ /value="?([^"]+)"? selected/g $hoge1 = $1; $hoge2 = $2; ↑これでは、ダメでした。 御教授 お願い致しますm( __ __ )m

    • ベストアンサー
    • Perl
  • 「マッチしない」正規表現の書き方

    正規表現について、おたずねします。 文字列 abc,def,ghi のいずれかにマッチする正規表現は (abc|def|ghi) ですよね。 それでは、「abc,def,ghi のいずれにもマッチしない」正規表現は、どう書けばいいのでしょうか? あちこち調べましたが、どうしてもわかりません。 ただし、if $a =~ /(abc|def|ghi)/ などで、=~ を !~ に直す、というのはナシです。あくまでも右辺の式の中で表現したいのですが…

  • [15]にマッチする正規表現

    [15]にマッチする正規表現 [15] にマッチする正規表現を書きたいのですが、うまくいきません。。。。 簡単だ、と思ったのですが。。。 expr "$DATA1" : .*\[15\].* と書くと、中の数字が15じゃなくてもマッチしてしまいます。 expr "$DATA1" : .*15.* であれば"15"にマッチしますが、対象の文字列の都合上、カッコでも識別する必要があり 困っております。[と]をエスケープする目的で\をつける、と思っているのですが、何か 思い違いをしているのでしょうか。

  • PHP5の正規表現でうまくマッチできない

    PHP5の正規表現で文字列中の独自タグをパースしようとしていて、 うまくいかず困り果てています。 正規表現パターンは、/<tag>.*<\/tag>/ 対象文字列は、<tag>こんにちは</tag><tag>こんばんは</tag> preg_match_all('/<tag>.*<\/tag>/', '<tag>こんにちは</tag><tag>こんばんは</tag>', $result) でマッチした文字列は、 $result[0]:<tag>こんにちは</tag> $result[1]:<tag>こんばんは</tag> となることを期待しているのですが、 実際は、 $result[0]:<tag>こんにちは</tag><tag>こんばんは</tag> となりました。 <tag>タグの間に入る文字列長、文字列フォーマットは不定です。 どうすれば期待通りの振る舞いに出来るでしょうか?

    • ベストアンサー
    • PHP
  • 正規表現

    Java 5.1 java.util.regex.Pattern java.util.regex.Matcher を用いてHTMLのTABLEを抽出したいのですが、ヒットしません。正規表現のパターンはどうしたらいいのでしょう? パターン: < *table.*?>[\s.]*?< */table *?> 検索対象: … <table border=1 width=200> <tr><th>AA</th><th>BB</th></tr> <tr><td>CC</td><td>DD</td></tr> <tr><td>EE</td><td>FF</td></tr> </table> … で、TABLEタグを含むTABLE全体を期待したのですが全くヒットしませんでした。 ちなみに * <table …>と</table>単体ではヒットします。 * ソースから改行文字を取り除いて一行テキストとした場合にはヒットします。 これらのことから、改行文字がマッチしていないことが原因かと思うのですが、パターンの正規表現についてご教授願います。

    • ベストアンサー
    • Java
  • 正規表現でマッチさせたい文字列の指定方法

    正規表現でマッチさせたい文字列の指定方法について こんにちは。正規表現について教えてください。 秀丸エディタでgrepする時に先頭行に 『ファイル名(行数): 』という文字列が 先頭行に入りますが、これを正規表現を使用して消したいと思っています。 具体的には以下のような表現ですが、どのように指定するのが正しいでしょうか。 いくらかテストしているのですが、なかなかうまくできず困っています。 消したい文字列 test.log-110411-01.bak.text(38): よろしくお願いします

  • エスケープ文字そのものにマッチさせる正規表現

     お世話になっております。  PHPの正規表現でエスケープ文字\そのものにマッチさせる正規表現がなかなか作れません。Perl互換のpreg_replaceなども試してみましたがダメでした。エスケープ文字そのものを削除したいのですが、どうしたらよいでしょうか? $value = ereg_replace ('\\', '', $value);//ダメでした。 $value = preg_replace ('/\\/', '', $value);//同様にダメでした。 $value = preg_replace ('/[\\]/', '', $value);//同様にダメでした。  文字列中に\が入っていたり、単独で\があった場合は必要ないので削除するといった感じです。 $value = ereg_replace ('[][}}{)(!"#$%&\\~|*+,/\^\'<>`;:?\\=]', '', $value); これでいけるかと思ったのですが、\だけ残ってしまいます。最後辺りの\\で\文字それ自体にマッチするかと思うんですが…。 わかる方がいらしたらおしえてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現で一発置き換え

     次のような条件の正規表現を模索中です。 ・対象はHTML文書 ・タグの外側のみ置き換える ・特定タグで囲まれた範囲は置き換え対象外とする  たとえば、   ABCDEF<B>GABC</B>KLM<STARTCOMMENT>ABCDE</ENDCOMMENT>OPQABCDE  という文字列があるとき、replace(/(A|B|C)/, "*") を実行するとします。  すると、   ***DEF<*>G***</*>KLM<ST*RT*OMMENT>***DE</END*OMMENT>OPQ***DE  普通ならこうなってしまいますね。  これを、   ***DEF<B>G***</B>KLM<STARTCOMMENT>ABCDE<ENDCOMMENT>OPQ***DE  こうなるようにしたいのです。  タグは置き換え対象としないという正規表現は実現できたのですが、特定タグで囲まれた範囲を対象外とする記述が思い浮かびません。  なぜなら、「<ENDCOMMENT>のない<STARTCOMMENT>があれば、それ以降を全て置き換え対象外とする」という仕様にしてしまったためです。  なんとか一文でバチッと置き換えるようなものがあれば、ヒントだけでも結構ですのでお教えください。

  • (秀丸)正規表現で、""をマッチさせるには?

    お世話になります。 以下2行に、それぞれマッチさせて、 末尾の""(ダブルコーティション)を外して置換えしたいです。 1-234,漢字,ABC,123円,"789" 1-234,漢字,ABC,"1,234円","789" 秀丸の正規表現 検索  ^(([^,]?)*),(([^,]?)*),(([^,]?)*),(([^,]?)*),"((.?)*)"$ 置換  \1,\2,\3,\4,\5 で試したところ、 1-234,漢字,ABC,123円,"789" では、マッチして、 1-234,漢字,ABC,123円,789 と置換されて結果OKでした。 しかし、 1-234,漢字,ABC,"1,234円","789" の方ではマッチしませんでした。 そこで質問させていただきますが、 1-234,漢字,ABC,"1,234円","789" でマッチするようにする為には、 上記しました秀丸の正規表現(検索)を、 どのように変更すればよろしかったでしょうか? 以上になります。 宜しくお願いいたします。