DOBON.NET DOBON.NETプログラミング掲示板過去ログ

パタン設定方法について(Match)

環境/言語:[windows7pro + vb.net 2008 .net framewoork2.0]
分類:[.NET]

みなさん はじめまして
こんにちは

早速ですが、vb.net Regex.Matchで

<FRAME NAME="main" SRC="/a/b/c.xxx/_xxxxxxx_?OpenView">

---上記のテキストからかきのように出力したい------
FRAME NAME:main
SRC:/a/b/c.xxx/_xxxxxxx_?OpenView
--------------------------------------------------


Dim pattern As String = "<FRAME NAME=""(?<text>.*)""\b""SRC=""(?Text>.*)>""" '←ここ、どのように設定すれば?

Dim m As Match = Regex.Match(html, pattern, RegexOptions.IgnoreCase Or RegexOptions.Compiled)

Do While m.Success

Console.WriteLine("FRAME NAME:{0} - SRC:{1}", m.Groups("text").Value, _
m.Groups("text").Value)

m = m.NextMatch()
Loop

よろしくお願いいたします。
結局何に悩んでいらっしゃるのかよく読み取れませんでしたが。

とりあえず、name属性の値にマッチさせるグループなら(?<name>とか、そういうグループ名を付ければ良いんじゃないでしょうか。
■No32641に返信(Hongliangさんの記事)
> 結局何に悩んでいらっしゃるのかよく読み取れませんでしたが。
>
> とりあえず、name属性の値にマッチさせるグループなら(?<name>とか、そういうグループ名を付ければ良いんじゃないでしょうか。

Hongliang様、レスありがとうございます。

うまく説明できずすみません。

html="<FRAME NAME="main" SRC="/a/b/c.xxx/_xxxxxxx_?OpenView">"
上記の文字列から

FRAME NAMEの「main」 と SRCの「/a/b/c.xxx/_xxxxxxx_?OpenView」
を取得したいが、
下記のように[pattern]定義したが、結果が得られませんでした。

Dim pattern As String = "<FRAME NAME=""(?<text>.*)""\b""SRC=""(?Text>.*)>"""
■No32642に返信(爽健美茶さんの記事)
> html="<FRAME NAME="main" SRC="/a/b/c.xxx/_xxxxxxx_?OpenView">"
ダブルクォーテーションの扱いが曖昧ですが、
 『<FRAME NAME="main" SRC="/a/b/c.xxx/_xxxxxxx_?OpenView">』
というデータということですよね。

> Dim pattern As String = "<FRAME NAME=""(?<text>.*)""\b""SRC=""(?Text>.*)>"""
これだと
 『<FRAME NAME="(?<text>.*)"\b"SRC="(?Text>.*)>"』
の意味になりますよね。実際には、
 『<FRAME NAME="(?<text>.*)" SRC="(?<Text>.*)">』
などを渡す必要があるのでは?

それと text と Text では区別しにくいので、グループ名を改めるべきかと。
■No32643に返信(魔界の仮面弁士さんの記事)
> ■No32642に返信(爽健美茶さんの記事)
>>html="<FRAME NAME="main" SRC="/a/b/c.xxx/_xxxxxxx_?OpenView">"
> ダブルクォーテーションの扱いが曖昧ですが、
>  『<FRAME NAME="main" SRC="/a/b/c.xxx/_xxxxxxx_?OpenView">』
> というデータということですよね。
>
>>Dim pattern As String = "<FRAME NAME=""(?<text>.*)""\b""SRC=""(?Text>.*)>"""
> これだと
>  『<FRAME NAME="(?<text>.*)"\b"SRC="(?Text>.*)>"』
> の意味になりますよね。実際には、
>  『<FRAME NAME="(?<text>.*)" SRC="(?<Text>.*)">』
> などを渡す必要があるのでは?
>
> それと text と Text では区別しにくいので、グループ名を改めるべきかと。

魔界の仮面弁士様
レスありがとうございます。



Dim stArrayData As String() = html.Split(" "c)

Dim matchText1 = Regex.Match(stArrayData(2), "SRC=""(?<text>.*)"">")

Dim matchText2 = Regex.Match(stArrayData(0) & " " & stArrayData(1), "<FRAME NAME=""(?<text>.*)""")

Dim matchText3 = Regex.Match(html, "<FRAME NAME=""(?<name>.*)""""\b""SRC=""(?<text>.*)"">")

Debug.Print(matchText1.Groups("text").Value) →OK

Debug.Print(matchText2.Groups("text").Value)→OK


Debug.Print(matchText3.Groups("name").Value)→NG
Debug.Print(matchText3.Groups("text").Value)→NG

スペースを分けて、個別で取得すればできました。
これで目的は果たしたので、問題ないですが、
ちょっとなにか方法がないものでしょうか。
忙しいところ申し訳ありませんが、余裕がありましたら、
教えていただけませんか。
どうぞよろしくお願いします。
■No32644に返信(爽健美茶さんの記事)
> ちょっとなにか方法がないものでしょうか。

No32643 で提示した正規表現では駄目ですか?
>>『<FRAME NAME="(?<text>.*)" SRC="(?<Text>.*)">』


元のコードで言えば、
>>> Dim pattern As String = "<FRAME NAME=""(?<text>.*)""\b""SRC=""(?Text>.*)>"""
ではなく、
Dim pattern As String = "<FRAME NAME=""(?<text>.*)"" SRC=""(?<Text>.*"")>"
にするということです。

でもって取り出し部分も、
>>> Console.WriteLine("FRAME NAME:{0} - SRC:{1}", m.Groups("text").Value, _
m.Groups("text").Value)
だと、両方とも "text" になってしまっているので、上記例だと、
NAME 側が .Groups("text") で
SRC 側が .Groups("Text") に修正するということです。
(先の指摘でグループ名を変更しているなら、適宜修正を)


> これで目的は果たしたので、問題ないですが、
元の html As String な変数に渡される文字列に、
どの程度の揺らぎがあるのか分からないので、
是非については判断しにくいです。(^^;
■No32645に返信(魔界の仮面弁士さんの記事)
> ■No32644に返信(爽健美茶さんの記事)
>>ちょっとなにか方法がないものでしょうか。
>
> No32643 で提示した正規表現では駄目ですか?
> >>『<FRAME NAME="(?<text>.*)" SRC="(?<Text>.*)">』

>
>>これで目的は果たしたので、問題ないですが、
> 元の html As String な変数に渡される文字列に、
> どの程度の揺らぎがあるのか分からないので、
> 是非については判断しにくいです。(^^;

魔界の仮面弁士様

素晴らしいです。出来ました。
とりあえず、やりたい事の第一歩ができました。
また、ご質問させていただきます。ありがとうございました。m(_ _)m
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板