menu
書いてる野郎
orebike@gmail.com
基本的に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は空文字になる