我正在使用vb.net实用程序,并且需要在字符串中找到所有不同的字符串。
所以基本上我会有一个看起来像这样的字符串。
1.875{0};10;0.25|1.875;9;0.25|{2}1.875;1.875;0.25|14.125;{1}1.875;0.25|{0}14.125;16.125{1};0.25|1.875;{0}16.125;0.25|1.875;9;0.25{2}|1.875;8;0.25
所以你可以看到我在字符串{0},{1},{2}
中有这些字符可以说,每个“占位符”都有多个。
所以我需要帮助编写一个函数,该函数将获取上面的字符串,并在此示例中返回3,因为源字符串中有3个不同的占位符。它会模仿sql中的distinct命令。
我确信这会使用某种正则表达式,但我无法绕过它来只检索不同的正则表达式。不是所有的倍数。
感谢任何帮助。在此先感谢。
答案 0 :(得分:1)
使用正则表达式和一点LINQ可以达到预期的效果
Imports System.Text.RegularExpressions
Imports System.Linq
Private Function CountPlaceholders(source As String) As Integer
Dim matches As MatchCollection = Regex.Matches(source, "{[0-9]+}")
Return matches.Cast(Of Match)().Select(Function(m) m.Value).Distinct().Count()
End Function
首先,使用相当简单的正则表达式查找所有占位符。 +
数字搜索后的[0-9]
会找到一个或多个数字,因此会找到占位符0到n。
下一行是对不同事件的计数。必须将matches
MatchCollection
中的每个项目强制转换为Match
才能运行LINQ-to-Objects扩展。之后,您选择Value
对象的Match
属性,过滤不同的值并计算它们。
答案 1 :(得分:0)
是的,你可以使用正则表达式{\d+}
来进行匹配,但你是正确的,不会给你一个明确的列表。但是您可以遍历Regex.Matches返回的Match集合,提取Value
并使用Distinct Linq方法获取不同条目的列表。
答案 2 :(得分:0)
您可以使用Split
函数将字符串分隔为string类型的单独列表项。然后使用LINQ
表达式在列表项的第一个位置选择唯一值。
Const Original As String = "1.875{0};10;0.25|1.875;9;0.25|{2}1.875;1.875;0.25|14.125;{1}1.875;0.25|{0}14.125;16.125{1};0.25|1.875;{0}16.125;0.25|1.875;9;0.25{2}|1.875;8;0.25"
Dim count = (From m As Match In Regex.Matches(Original, "{[0-9]+}") _
Select m.Value).Distinct.Count
您可以在Count
命令之后组合Distinct
命令,但我在这里将它们分开,以便更容易逐步完成并确认它是您想要的。
修改强> 我一直相信Regex可能是去这里的方式,请参阅Bob Mc的回答或我的查询语法中的LINQ状态