Visual Basic 2005/正規表現

Visual Basic 2005/正規表現

基本的に1回の正規表現で取れないと思ったら、素直に2回に分ける。驚くほど簡単になりる。お前が思うほどコンピュータは遅くない!

.net frameworkなのでそのままC#にも流用できると思う。

正規表現使うセット

Imports System.Text.RegularExpressions
Dim r As Regex = New Regex("href\=\""(?<1>.*?)\""")
if r.Match("hogehoge").Success then
    '何か
end
r.Match("hogehoge").value
r.Matchs("hogehoge")
Dim hoges As MatchCollection = r.Matches(strHoge)

正規表現のオプションを指定する

Dim r As Regex = New Regex("hoge", RegexOptions.IgnoreCase)

列挙体があるので使う オプションを複数指定したいときはORで繋ぐ

右方向から検索する

.NET独特のオプションで、正規表現を通常左方向から(先頭から)の検索を右方向から判定することができる。 必要部分が対象の先にある場合に便利

Dim r As Regex = New Regex("hoge", RegexOptions.RightToLeft)

最初にヒットした部分を取り出す

Imports System.Text.RegularExpressions
 
Dim r As Regex = New Regex("(http|https).+\.jpg")
Dim m As Match
m = r.Match("ノイズノイズhttp://www.hoge.jp/kkkk.jpgノイズノイズ")
MsgBox(m.value)

結果

http://www.hoge.jp/kkkk.jpg

複数ヒットさせて取り出す

これの場合は Match メソッドではなく Matches メソッド

Dim hoges As MatchCollection = rHoge.Matches(strHoge)

返りは Match オブジェクトではなく MatchCollection オブジェクトになる。つまり一般的にいう「gオプション」な感じの挙動。 だけど、結果が通常結果のコレクションで戻ってくるのでさらにいじれるという便利さがある

ヒットしたかを知る

r.Match("hoge").Success

を使う。ヒットすればTrue

ヒット部分を置換する

Dim rHoge As Regex = New Regex("hoge")
Dim strMoge As String = "hogemogehoge"
 
strMoge = rHoge.Replace(strMoge, "pyapya")
strMoge⇒pyapyamogepyapya

これを利用すると、ヒット部分を削除したりもできる。これは取り出す場合と違い、ヒット部分全部を置換する。

ヒット部分の一部を利用して置換

Dim rHoge As Regex = New Regex("(ho|mo)ge")
Dim strMoge As String = "hogemogehoge"
strMoge = rHoge.Replace(strMoge, "[$1]")
strMoge⇒[ho]ge[mo]ge[ho]ge

こうなる、括弧()で括った部分が一まとまりになってそれが頭から順番に$1,$2・・・という変数に自動的に割り当てられるのでそれを利用できる

これは置換前の文字列が、置換後にも含まれている場合に威力を発揮する。 ho と mo が別々に分かれていて置換文字列の中にもho mo が含まれているとばらばらに置換しようとすると、意図せず文字列が増えてしまいますから

ヒット部分を削除する

ヒット部分を置換する 参照

ヒットした部分からさらに部分を取り出す

<a href="hogehoge.html"><img src="hoge.gif"/></a>

から href の属性値だけ抜きたい場合は

Dim rHoge As Regex = New Regex("href\=\""(?<1>.+?)\""")

こういう風に書く

(?<1>なにやら正規表現)

の部分がヒット後に取り出せる ちなみに .+?. が任意の1文字 + が前方の文字の1文字以上の連続、つまり .+ で1文字以上の任意の連続文字列 ? が最小範囲を表す、これをつけないと+は最大範囲を取りに行くのでgifの後ろのダブルクォートまでがヒット範囲になる

話は戻ってカッコに1という番号をつけたので

r.Match("もじれつ~").Groups(1).Value

ヒットしなかったら?

pyapya = r.Match(hoge).value

のpyapyaは空文字になる

Tag

ms/visual_basic_2005/regular_expression.txt · 最終更新: 2017-09-26 20:03 by ore