3

以下の例では、文字列内のすべての HotelNames を取得するために VB.NET を使用しようとしています。

これが私のコードです:

    Dim thepage As String = postreqreader.ReadToEnd

    Dim r As New Regex("""HotelName"":"".*""")
    Dim matches As MatchCollection = r.Matches(thepage)
    For Each hotelname As Match In matches
        ListBox1.Items.Add(hotelname.Value.Split("""").GetValue(3))
    Next

ただし、これは最初の HotelName を ListBox に追加するだけです。各 HotelName の一致をリストボックスに入れる方法はありますか? 御時間ありがとうございます!

短縮文字列:

"HotelName":"ホームウッド スイーツ バイ ヒルトン ダラス - アーリントン","HotelNameShort":"ホームウッド スイーツ バイ ヒルトン...","HotelNameShortAvailabilityRecommendations":"ホームウッド スイーツ バイ H...","HotelName":"ナイツ イン アーリントン","HotelNameShort":"Knights Inn Arlington","HotelNameShortAvailabilityRecommendations":"Knights Inn Arlingto...","HotelName":"Howard Johnson Express Inn - Arlington Ballpark / Six Flags","HotelNameShort":"Howard Johnson Express In...","HotelNameShortAvailabilityRecommendations":"ハワード ジョンソン エクスプレス...","HotelName":"スーパー 8 アーリントン/SW","HotelNameShort":"スーパー 8 アーリントン/SW","HotelNameShortAvailabilityRecommendations":"スーパー 8 アーリントン/サウスウェスト...",

4

1 に答える 1

1

あなた.*は貪欲です。つまり、可能な限り消費するため、最初の一致は文字列全体を最後の". 次に、その 1 つの一致 (実際にはすべてのホテル名を含む) を at で分割"し、3 番目の要素を取り出します。(チェックしてくださいhotelname.Value.Split("""").Count、それは巨大になります)

秘訣は、繰り返しを非貪欲にするか、さらに良いことに、繰り返しが消費されないようにすること"です。

"""HotelName"":""([^""]*)""

との間""非引用符のみを繰り返しているため、最初の終了引用符を超えることはできません。これだけで問題は解決するはずですが、括弧も追加しました。これらは実際の括弧とは一致しませんが、代わりにキャプチャ グループを作成します。これにより、ホテル名の取得がさらに簡単になります。

For Each hotelname As Match In matches
    ListBox1.Items.Add(hotelname.Groups[1])

match.Groups括弧のすべてのセットについて、左から右に開き括弧を数えながら、それらの内部で一致するものが の 1 つの要素に入れられます。正規表現マッチングは、個々の値を取得するために必要なすべてのことをすでに行っているので、2 番目の分割ステップを実行する必要はありません。

于 2012-11-07T23:54:08.817 に答える