.NETのスマートな正規表現の書き方

このQ&Aのポイント
  • VB8 (2005)で、正規表現の書き方ですが、抽出する方法とマッチしたかの判別方法を知りたいです。
  • For文を使わずに直接取得する書き方があるかも知りたいです。
  • また、.NETの正規表現の書き方が一般的でなければ、ご指導お願い致します。
回答を見る
  • ベストアンサー

.NET のスマートな正規表現の記述の仕方

VB8 (2005)で、正規表現の書き方ですが、抽出する場合は、 以下のようにしましたが、抽出せず、単にマッチしたかとうが If文で判別する方法が知りたいです。 Imports System.Text.RegularExpressions '正規表現 Dim dat As String = "TEST 01" Dim ptn As String 'パターン Dim r As Regex ' Dim dv As String '部分 '抽出 ptn = "^TEST ([0-9]+)$" r = New Regex(ptn, RegexOptions.IgnoreCase) For Each m As Match In r.Matches(dat) dv = m.Groups(1).Value() MsgBox("抽出=[" & dv & "]") Next あと、上のようにFor文で回していますが、Globalでなく、今回は1つだけの抽出で、しかも1つだけの()なので、これをFor文を使わずに直接取得する書き方はあるのでしょうか? それ以前に、.NETの正規表現の書き方が一般的でなければ、ご指導お願い致します。

  • hdkoa
  • お礼率0% (1/117)

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Forのブロックを if r.matches(dat).Length > 0 then   dim m as Match = r.matches(dat)(0)   MsgBox( "抽出=[" & m.Group(1).Value & "]") end if といった具合にすればいいのでは ・・・

関連するQ&A

  • VB.NETの正規表現の検索を教えてください。

    VB.NETの正規表現で文章中(HTMLソース)から番号を抜き取りたいのですが、 先頭の1つだけしか見つけられません。 htmlソース内に 番号:10000 番号:20000 番号:30000 番号:40000 という文字があるので、その後半の10000や20000を取得したいです。 下記のコードで実行すると、10000が4つ出力されてしまいます。 良い方法をご教示頂きたいです。よろしくお願いいたします。 Dim pagedata As String  <---htmlソース Dim reg As Regex reg = New Regex("番号:(?<datano>.+)", RegexOptions.Compiled) Dim DataNo As String m = reg.Match(pagedata) While m.Success = True DataNo = reg.Match(pagedata).Result("${datano}") m = m.NextMatch() Console.WriteLine(DataNo) End While

  • VB.NETの正規表現の書き方を教えてください

    いつもお世話になっております。 また正規表現がわからなくなってしまったのですが、 お助け願えないでしょうか。 Strの中にはこのようなものが入っています。 Str="あいうえお=====かきくけこ=====さしすせそたちつてと=====まみむめも=====なにぬねの" Dim r As Regex Dim m As Match Dim StrR As String r = New Regex("=====.+=====") m = r.Match(Str) While m.Success StrR = m.Value m = m.NextMatch() End While 順番に StrR="=====かきくけこ=====" StrR="=====まみむめも=====" を取得したいのですが、 上記のような書き方だと、 StrR=====かきくけこ=====さしすせそたちつてと=====まみむめも=====" を取得してしまいます。 回数の指定など色々試してはみたのですが、 どうしても目的のとおりにすることができず困っておりまして、 書き方をご教示頂きたくよろしくお願い致します。

  • VB.NETの正規表現をVBAで記述するには

    VB2010.NETのコードをExcel2010のVBAのコードに置き換える作業をしていますが、List1のようにVB.NETのコードには、Inports System.Text.RegularExpressions で.NET正規表現パッケージが使われて、この部分をVBAではどのように記述すればよいのでしょうか。 自分なりにList2のようにしてみましたが、Dim M As MatchのMatchの部分で「ユーザ定義型は定義されていません」というコンパイルエラーが発生します。 参照設定にはSystem.Text.RegularExpressionsが見当たりませんが何を指定すればよいのでしょうか。 Microsoft VBScript Regular Expressions 5.5のRegExpオブジェクトでは後読みができないので大変困っています。 よろしくお願いします。(Windows7) ---List1:VB.NET(正常)--------------- Option Explicit On Option Strict On Imports System.Text.RegularExpressions Module Module1  Sub Main()   Dim SampleText As String = "今日は西暦2014年6月20日です"   Dim M As Match = Regex.Match(SampleText, "(?<=西暦)\d+")   If Not M.Success Then    Console.WriteLine("no match")   Else    Dim MatchedText As String = M.Value    Dim MatchedFrom As Integer = M.Index    Dim MatchedLen As Integer = M.Length    MsgBox("matched [" & MatchedText & "]" & _        " from char#" & MatchedFrom.ToString() & _        " for " & MatchedLen.ToString() & " chars.")   End If  End Sub End Module ---List2:VBA(このコードではエラーになる)----- Option Explicit Sub test()  Dim SampleText As String  Dim M As Match  Dim R As New Regex  Dim MatchedText As String  Dim MatchedFrom As Integer  Dim MatchedLen As Integer  SampleText = "今日は西暦2014年6月20日です"  R = Regex("(?<=西暦)\d+")  M = R.Match(SampleText)  If Not M.Success Then   MsgBox ("no match")  Else   MatchedText = M.Value   MatchedFrom = M.Index   MatchedLen = M.Length   MsgBox("matched [" & MatchedText & "]" & _       " from char#" & MatchedFrom.ToString() & _       " for " & MatchedLen.ToString() & " chars.")  End If End Sub ------------------------------------------

  • 正規表現で指定したURLに飛びたいのですが・・・・

    お世話になっております。 VB2005ユーザーです。 こちらで回答をいただくみなさんには頭が下がる思いでいっぱいです。 もう少々、お力をお貸しいただけませんか。 宜しくお願いいたします。 当方、環境はVB2005です。 WebBrowserにて、HTMLを操作していくプログラムに挑戦しています。 ある特定の文字列のリンクに飛ぶには、正規表現を使用し、URLを抽出するというところまでわかったのですが、 この正規表現の部分をwindowsフォーム内のテキストボックスの文字列にするにはどのようにしたらよいでしょうか? 以下は当方がチャレンジしましたが、無理だったパターンです。 Dim r As Regex = New Regex( _ "<a\s+[^>]*href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>[^\s>]+))[^>]*\s*.*" + TextBox1.text, _ RegexOptions.IgnoreCase Or RegexOptions.Compiled) Dim m As Match = r.Match(.Document.Body.InnerHtml) Dim St As String = m.Groups(1).Value '拾ってきたコード .Navigate(St) ・・・というようにしました。 上記の「+ TextBox1.text」の部分にテキストボックス内の文字列を挿入したいのです。 「+ TextBox1.text」の箇所を「TextBox1.text"」とすれば「TextBox1.text」自体を探してしまいますし・・・。 ちょっと行き詰ってしまいまして。 ご教授いただければ幸いでございます。 宜しくお願いいたします!!

  • 正規表現を使って、文字列切り取り

    .NETですが、正規表現なのでこちらで質問させて頂きます。 ちなみに、ここにリファレンスがここにあります・・・ http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpgenref/html/cpconatomiczero-widthassertions.asp 二重破線内のような文字列がある場合に、 一重破線のみを切り取りたいのです。 今思いついているのは、 Dim strRegex As String = "CREATE PROCEDURE(?<parameter>:a+)AS" Dim reg As New System.Text.RegularExpressions.Regex(strRegex, RegexOptions.Multiline Or RegexOptions.IgnoreCase) If reg.Match(strStoredString).Success Then MsgBox(reg.Match(strStoredString).Result(("${parameter}"))) End If こんな感じなのですが、 正規表現の記述方法でもいいので、教えて下さい。 よろしくお願い致します。 ================================ -- aaaaaaaaaaaaeefefe CREATE PROCEDURE [opsys_parameter] @いつから AS datetime, -- 対象日 | @customer_no int, -- @aaa varchar(32) AS xxxxx bbbb ccc ================================ -------------------------------- @いつから AS datetime, -- 対象日 | @customer_no int, -- @aaa varchar(32) --------------------------------

    • ベストアンサー
    • Perl
  • VB.NETの正規表現を教えてください

    VB.NETの正規表現でURLから特定の部分だけを 抜き取りたいのですが、どのようにしたら良いでしょうか。 下記のコードはMSDNのページで見つけたのですが、 Dim url as string="http://www.contoso.com:8080/letters/readme.html" Dim r As New Regex("^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",RegexOptions.Compiled) dim a as String a = r.Match(url).Result("${proto}${port}") とすると、aにhttp::8080 が入るというものなのですが、 これを少し変更して url = "http://www.yahoo.co.jp/~user123456/ABCDEFG/data/text" というURLだった場合にa=ABCDEFGを取得したいです。 ABCDEFGの前後は固定なので、正規表現の中にこの部分も明示して置きたいです。 IsMatchで "http://www.yahoo.co.jp/~user123456/.+/data/text" 書けばTrueが返ることまでは出来たのですが、 ABCDEFGの部分を取得する方法がわからないので、 恐れ入りますが方法を教えて頂きたいです。 よろしくお願い致します。

  • VB.NETの正規表現の書き方を教えてください。

    下のような改行を含む文字列から、1や2を指定してデータ1、データ2を取得したいです。 決まった文字列(変更のない)はNAMEのみで、 取得したい文字列ですが、例えば2を指定した場合は 具体的には NAME=b12345 A=b12345 B=b98765 C=bXYZ このような内容を取得したいです。 -------------------------------------- abcde aiueokakikukeko ここに改行を含むいろな文字列がある場合とない場合があります。 asdfghj NAME=a12345 A=a12345 B=a98765 C=aXYZ ここに改行を含むいろな文字列がある場合とない場合があります。 NAME=b12345 A=b12345 B=b98765 C=bXYZ ここに改行を含むいろな文字列がある場合とない場合があります。 NAME=c12345 A=c12345 B=c98765 C=cXYZ ここに改行を含むいろな文字列がある場合とない場合があります。 -------------------------------------- 正規表現の部分は現在はこのように書いてあります。 Dim i As Integer = 2 Dim reg As Regex Dim m As Match Dim Target As String reg = New Regex("", RegexOptions.Compiled Or RegexOptions.Multiline) m = reg.Match(Data) If m.Success = True Then Target = reg.Match(Data).Result("${Target}") End If Console.WriteLine(Target) 数量の指定をすれば何とかなりそうだと思ったのですが、 試行錯誤しても思うように取り出すことが出来ず 申し訳ないのですが、適切な書き方をご教示頂ければ幸いです。

  • vbaの正規表現で、マッチした一部分を抽出したい

    accessの正規表現で、マッチした部分の一部を取り出したいと思っています。 秀丸で言えば、 ------------------------ 文字列 あいうえお ↓↓↓ 正規表現 あ(.*)お 置き換え文字 \1 ↓↓↓ 抽出 いうえ ------------------------ って感じの「¥1」みたいなのがほしいと考えています。 現在、下記のような感じで、対象文字を抽出しています。 ここから、また正規表現でほしい部分を抽出しなければいけないのでしょうか? 【上の例で言えば、「あいうえお」を抽出する関数】 ------------------------ Function 抜き出し(ByVal 指定文字列 As String) As String Dim 正規表現, 一致集団, 一致要素 Set 正規表現 = CreateObject("VBScript.RegExp") 正規表現.Pattern = "購入日時[0-9]{4}年[0-9]{1,2}月[0-9]{1,2}日 [0-9]{1,2}時[0-9]{1,2}分" 正規表現.MultiLine = True Set 一致集団 = 正規表現.Execute(指定文字列) For Each 一致要素 In 一致集団 抜き出し = 一致要素.Value Exit For Next End Function ------------------------ これだと、 購入日時2012年1月25日 17時53分 がマッチします。 でもほしいのは、 2012年1月25日 17時53分 の部分だけ。 何かいい方法は無いでしょうか? よろしくお願いします。

  • 正規表現で<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 >などにも対応したりと 条件がいろいろありすぎて色々試したのですが、 どうしても分かりませんでした。 申し訳ございませんが、お助け頂ければ幸いです。

  • 正規表現を使った文字列の検索及び置換について

    正規表現の検索及び置換について質問させていただきます。 下記のような文字列があったとします。 「私は、<gaiji gaijisyurui="0001" gaijicode="F040" /><gaiji gaijisyurui="0002" gaijicode="F041" />で、 <gaiji gaijisyurui="0003" gaijicode="F042" />です。」 この文章から  <gaiji gaijisyurui="0001" gaijicode="F040" />  <gaiji gaijisyurui="0002" gaijicode="F041" />  <gaiji gaijisyurui="0003" gaijicode="F042" /> の部分を検索して、それぞれ  <外字0001F040>  <外字0002F041>  <外字0003F042> と置き換え、最終的には、  「私は、<外字0001F040><外字0002F041>で、<外字0003F042>です。」 という文字列にする関数を作成したいと思っておりますが、どのようにソースを作ればよろしいのでしょうか? アドバイスや具体的なソースコードをいただけると非常に助かります。 現在、途中までソースを作成しているのですが、文字数制限でソースの半分も入りきらなかったため大雑把に書かせていただきます。 ※※※以降の処理が分かりません。 検索結果に対して文字列置換を行っても元の文字列内の置換にはならない? Private Function GaijiChange(ByVal pNaiyo As String) As String Dim wNaiyo As String = "" ' 置換後文字列 Dim wGaijisyurui As String = "" Dim wGaijicode As String = "" Dim wChangeWord As String = "" Dim wChangeStr As String = "" Dim Work As String = "" ' 正規表現で<gaiji>タグを検索 Dim wSeikiHyogen As String wSeikiHyogen = "<gaiji gaijisyurui=\" & """" & "[0-9a-zA-Z]{4}\" & """" & " gaijicode=\" & """" & "[0-9a-zA-Z]{4}\" & """" & " />" '正規表現 Dim wRegex As New System.Text.RegularExpressions.Regex( _ wSeikiHyogen, System.Text.RegularExpressions.RegexOptions.IgnoreCase) ' 文字列にに含まれる<gaiji>タグを全て検索 Dim wMc As System.Text.RegularExpressions.MatchCollection = wRegex.Matches(pNaiyo) For Each m As System.Text.RegularExpressions.Match In wMc ' 検索結果からgaijisyuruiを取得 wGaijisyurui = ' 検索結果からgaijicodeを取得 wGaijicode = ' 置換文字列作成 wChangeWord = "<外字" & wGaijisyurui & wGaijicode & ">" ' 検索結果を置換 ' ※※※ Next Return wNaiyo End Function 以上、宜しくお願いいたします。

専門家に質問してみよう