regex - 让所有正则表达式匹配出现在列表框中,VB.NET

标签 regex vb.net listbox listboxitems

我有一个字符串,如下例所示,我在其中尝试使用 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 匹配项放入我的列表框中吗?感谢您的宝贵时间!

缩短的字符串:

"HotelName":"Homewood Suites by Hilton Dallas-Arlington","HotelNameShort":"Homewood Suites by Hilton...","HotelNameShortAvailabilityRecommendations":"Homewood Suites by H...","HotelName":"Knights Inn Arlington","HotelNameShort":"Knights Inn Arlington","HotelNameShortAvailabilityRecommendations":"Knights Inn Arlingto...","HotelName":"Howard Johnson Express Inn - Arlington Ballpark / Six Flags","HotelNameShort":"Howard Johnson Express In...","HotelNameShortAvailabilityRecommendations":"Howard Johnson Expre...","HotelName":"Super 8 Arlington/SW","HotelNameShort":"Super 8 Arlington/SW","HotelNameShortAvailabilityRecommendations":"Super 8 Arlington/SW...",

最佳答案

你的 .* 是贪婪的。这意味着它会消耗尽可能多的资源,因此您的第一个匹配项将包含 整个 字符串,直到最后一个 "。然后您拆分一个匹配项(实际上包含所有酒店名称)在 " 并取出第三个元素。 (查看hotelname.Value.Split("""").Count,会很大)

诀窍是让重复成为非贪婪的,或者更好的是,不允许重复消耗 ":

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

现在在 "" 之间我们只重复非引号字符,所以我们永远不能超过第一个结束引号。仅此一项就可以解决您的问题,但我还添加了这些括号。它们不会匹配任何实际的括号,而是创建一个捕获组,这使得酒店名称的检索更加容易:

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

对于每一组括号,里面匹配的内容将被放入match.Groups的一个元素中,从左到右计算左括号。正则表达式匹配已经完成了获取单个值所需的一切,那么为什么还要执行第二个拆分步骤。

关于regex - 让所有正则表达式匹配出现在列表框中,VB.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13280155/

相关文章:

javascript - JS RegEx .replace() 条件模式和子组

python - 如何提取由 square braquet 分隔的子串并生成子串

c# - 将 Windows 窗体对象添加到列表框

regex - 如何使用基于正则表达式的列表中的值将列添加到 data.table

c# - C#中查找关键字最快的算法

c# - 使用 LINQ 和 C# 的随机数组

ASP.NET web 应用程序中的 Javascript 消息框

VB.Net Switch 语句,在每种情况下都包含代码段

c# - 如何将 IEnumerable<string> 绑定(bind)到 ListBox?

c# - 将 BindingList 绑定(bind)到 ListBox 时遇到问题