• ベストアンサー

正規表現で複数行を検索したいです。 VB.NET

VB.NETの正規表現で2つの文字列に囲まれた複数行の部分を取得したいです。 START ABCDE FGHIJ END 上記のようになっていた場合に ABCDE FGHIJ を取得したいです。 対象は START END のようになっていたり、 STARTEND のようになっていたりする場合にも対応できるようにしたいです。 色々試してみて .*?(\r\n)*? で良いように思ったのですがだめなようです。 もうしわけございませんが、ご教授いただければ幸いです。

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

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

Option Explicit On Option Strict On Option Compare Binary Option Infer Off Class Q4484686 Shared Sub Main() Dim r As System.IO.StreamReader Dim s As String r = New System.IO.StreamReader(New System.IO.FileStream("hoge.txt",System.IO.FileMode.Open),System.Text.Encoding.getEncoding(65001),false) s = r.ReadToEnd '本当は例外処理入れなきゃいけないと思うのですが省略します r.Close() 'ここまでは単なる準備 Dim regExp As System.Text.RegularExpressions.RegEx regExp = New System.Text.RegularExpressions.RegEx("START(((?!END).)*)END",System.Text.RegularExpressions.RegExOptions.Singleline) Dim ms As System.Text.RegularExpressions.MatchCollection = regExp.Matches(s) System.Console.WriteLine(ms.Count) For each m As System.Text.RegularExpressions.Match in ms System.Console.WriteLine(m.Groups(1).ToString()) System.Console.WriteLine("=======================") Next System.Console.ReadKey(true) End Sub End Class '多分コレでよいかと。動かなかったらすまん。 'STARTが単独で存在し,ENDがないとか 'STARTがなくてENDだけあるとか 'STARTが1個でENDが2個あるとか 'STARTが2個でENDが1個あるとか 'あまり深くは考えてない

goo081102
質問者

お礼

himajin100000様、詳しいサンプルを書いて下さいまして ありがとうございます。 参考にさせて頂きたいと思います。ありがとうございました。

関連するQ&A

  • コメントアウト以外を置換対象とする正規表現について質問です。

    コメントアウト以外を置換対象とする正規表現について質問です。 以下の(1)の入力に対して(2)の結果を得たいのですが、 綺麗な正規表現を使って置換する方法を教えて下さい。 とりあえず複数回に分けて無理やり置換したのですが、 とても汚いコードになってしまいました。。。 (前提) ・コメントは/*...*/ と //... の2種類 ・コードは改行を含めて1変数に格納されている ・目的はコメントアウト以外の「abcde」を「aaaaa」に置換すること (1) ---------------------------------------------------- /* abcde fghij */ abcde fghij /* abcde fghij */ abcde fghij // abcde fghij abcde fghij /* abcde fghij */ abcde fghij /* abcde fghij */ ---------------------------------------------------- (2) ---------------------------------------------------- /* abcde fghij */ aaaaa fghij /* abcde fghij */ aaaaa fghij // abcde fghij abcde fghij /* abcde fghij */ aaaaa fghij /* abcde fghij */ ---------------------------------------------------- (考えた方法) ---------------------------------------------------- $st = "#START#"; $ed = "#END#"; s/\b(abcde)\b/${st}$1${ed}/sg; s/(\/\*.*?)${st}(.*?)${ed}(.*?\*\/)/$1$2$3/sg; while(s/(\/\/.*?)${st}(.*?)${ed}/$1$2/g){}; s/${st}abcde${ed}/aaaaa/sg; ---------------------------------------------------- ご回答よろしくお願いします。

    • ベストアンサー
    • Perl
  • 正規表現について VB6

    VB6で正規表現(Microsoft VBScript Regular Expression 5.5を使っているのですが、 (1) No001の場合、001を取得 (2) Noの場合は空文字を取得 したいのですが、どうすればよいのでしょうか? re.Pattern = "^No(.+)$" この場合、(1)の場合、マッチしますが(2)でマッチしません。 正規表現に詳しい方、VB6で正規表現をよく使う方、教えて下さい。

  • PHPにおける正規表現について

    PHPにおける正規表現について ご教授ください。 いわゆる、対象の文字列が複数行にわたっていた場合のことです。 $data = <<< EOF ABCDE FGH EOF; $hoge = preg_match("/EF/" ,$data,$match); と上記のようなコードがあった場合 対象の文字列群から【EF】という文字列を検索したい場合、どのように記述したら 【E(間に改行)F】の文字列と一致させる事ができるでしょうか? 仮に正規表現の修飾子の【s】や【m】を用いても上記の例の場合 一致させることができないと思います。 やはり、対象の文字列群 $data の改行文字をいったん削除したものから検索 するのがベターでしょうか? 正規表現に造詣の深い方よろしくご教授ください。

    • ベストアンサー
    • PHP
  • VB.NET で正規表現を使用した検索でフリーズする

    VB.NET(2003)ですが、Regexを使った正規表現での検索時に検索パターンによっては、プログラムがフリーズして固まります。なにか情報はないでしょうか? VBプログラムファイル内のコメントを一気に検索するつもりで、 (".*?"|[^"'])*('.*?)\r\n とするとOKですが、 (".*?"|[^"']+)*('.*?)\r\n とするとフリーズします。(+を一つ足した) プログラムは、 pMatches = Regex.Matches(src, pat) If pMatches.Count = 0 Then MsgBox("マッチしません") End If といった感じで、 src=対象テキストを全行取込んだ文字列、pat=検索パターンです。 フリーズは、pMatches.Countの部分で起こっているようです。 Matchesの変わりにMatchとNextMatchを使うと、順に検索結果が得られますが、最後の結果にNextMatchを実行したところで固まります。 フリーズ中、タスクマネージャで見ている限りではCPU=100%(HTでは50%)、となりますが、使用メモリー量は変化ありません。

  • 1行~複数行をまとめる正規表現

    こんにちは、いつも参考にさせていただいております。 正規表現で思ったような処理ができず困っております。 [やりたいこと] 1行~複数行の可能性のある行をまとめて正規表現で表したい。 [例] 最初2行と最後2行は固定 真ん中は 0行の時もあれば、100行の時もある。 このとき、真ん中の行をどう書けばいいのかわかりません。 ////// // // 例文1 // example(2) // ・・・ // ・・ // ・ // ////// [自分でやってみた例] ^//////$ ^//$ ^// \S\$$ \S ^//$ ^//////$ これだと、上の例でいう4行目でエラーになります・・。 [正規表現エンジン] Jakarta Regexp です。 思い当たる節のあるかた、ご教授お願いいたします。 アドバイス・ヒントなどもお待ちしております。 なにとぞ、宜しくお願い致します。

  • 正規表現について

    任意の文字は「.」であらわされるようですが、とほほさんのサイトによると、\nは除いた任意の文字とあります。\nも含んだ任意の文字はどう表現すればいいのでしょうか? .|\n でいいんでしょうか? テキストファイルを$dataに読み込み、<start>と<end>にはさまれた改行を含む文字列を取得しようと、 if($text =~ /<start>(.*)<end>/){  print $1; } としたのですが、if文に引っかかりません。さらに、 if($text =~ /<start>([.\n]*)<end>/){  print $1; } かな?と思いましたがこれもできませんでした。 何かいい方法はないでしょうか?

    • ベストアンサー
    • Perl
  • 正規表現で<BR>の行を除外したいです。 VB.NET

    VB.NETで正規表現を使って2つの文字列に囲まれた部分を 取得したいのですが、文字列の先頭と末尾の部分の<BR>の行と 空行を削除したいです。 具体的には対象の文字列が ”ABC <BR> <BR> あいうえお <BR> かきくけこ <BR> さしすせそ <BR> <BR> <BR> XYZ” となっていた場合に ”あいうえお <BR> かきくけこ <BR> さしすせそ” を取得したいです。 現在このようになっています。 Public STR As String Sub Form1_Load Dim sr As New System.IO.StreamReader("c:\0.html", system.Text.Encoding.Default) STR = sr.ReadToEnd TextBox2.Text = "(?<data>.+?)" End Sub Sub Button1_Click  Dim A As String = "ABC"  Dim Z As String = "XYZ"  Label1.Text = A & TextBox2.Text & Z  Dim r As New Regex(Label1.Text, RegexOptions.Singleline)  Dim m As System.Text.RegularExpressions.Match  Try  TextBox1.Text = r.Match(STR).Result("${data}")  Catch ex As Exception  Console.WriteLine("Error")  End Try End Sub <BR>が<br>や<Br><bR>< br >などにも対応したりと 条件がいろいろありすぎて色々試したのですが、 どうしても分かりませんでした。 申し訳ございませんが、お助け頂ければ幸いです。

  • VB2010の正規表現

    VB2010の正規表現についての質問です。 ファイル名に複数のドット(ピリオド)が含まれる時や、複数の拡張子がある時でも、 一番最後にある拡張子だけを取り出したいのです。 System.Text.RegularExpressions.Regex("正規表現") で正規表現を指定していますが、 例えば、『T.M.Revolution.m3u』の場合は、『.m3u』だけを取り出したいので、 ("[.].*$") とすると、マッチする部分が『.M.Revolution.m3u』となる為、 ("([.].*){1}$") に、試しに変更してみましたが、失敗してしまいました。 知っている方、 『上記の書き方だと何故ダメなのか』 と、 『この場合の正しい正規表現』 を教えていただけませんか? あと、正規表現ではない代替案などが有れば、是非それも教えて頂きたいです。 よろしくお願いします。

  • 正規表現について

    /^R|ruby$/ 上記のような正規表現があったとします。 この正規表現の【|】の判断がわかりません。具体的には、/^ $/という記述から 対象の文字列の先頭がRかrのどちらかで以降がubyと続く文字列にマッチという 意味だと解釈しているのですが違うのでしょうか? 具体的にはRubyという文字列かrubyという文字列の二つのうちどちらかにしか マッチしないとおもっていたのですが、 rrubyという文字列やRrubyという文字列にもマッチします。そもそもこの場合のR|rの箇所ですが、これはRかrのどちらかが先頭にあり 二文字目からはubyという文字列がつづきますよ。という正規表現ではないのでしょうか? かなりこまっています。 識者のかたご教授ください。

  • 正規表現についてご教示お願いします。

    正規表現についてご教示お願いします。 文字列:111,222,STR1234567END,STR222567END 上記文字列にて "STR1234567END"の部分を取り出したいのですが 正規表現:STR.*END で指定しますと "STR1234567END,STR222567END" と取得されてしまい上手く出来ません。。。 他にもいろいろ試しているのですが "STR1234567END"と取得できません。 どうかご教示頂けたらと思います。 よろしくお願いします。

専門家に質問してみよう