我正在使用下面的代码取一个字符串并将其拆分为一个数组。它将采取:迪斯尼乐园,并使其成为两个独立的元素。如果字符串包含“Disney Land”,则它是数组中的一个元素。效果很好,但每次都会向数组中添加一些空元素。所以我只是迭代元素并删除它们,如果它们是空的。是否对下面的代码进行了调整,以防止出现这些空元素?
Private m_Reg As Regex
m_Reg = New Regex("([^""^\s]+)\s*|""([^""]+)""\s*")
Dim rezsplit = m_Reg.Split(criteria)
答案 0 :(得分:2)
使用Matches
代替Split
,您无需担心。你也可以简化正则表达式:
m_Reg = New Regex("""([^""]+)""|[^""\s]+")
编辑:我忘了处理报价的问题了。这样会更容易:
m_Reg = New Regex("""(?<Value>[^""]+)""|(?<Value>[^""\s]+)")
现在,无论哪种替代匹配,都可以在名为“值”的组中找到所需的文本。
答案 1 :(得分:2)
艾伦的回答是正确的。使用他的模式,我们可以使用LINQ过滤Split
结果,或者我可以按照他的建议使用Matches
。
Dim input As String = "Islands of Adventure ""Disney Land"" Universal Studios"
Dim pattern As String = "(?<Value>[^""\s]+)|""(?<Value>[^""]+)"""
Dim result = Regex.Split(input, pattern).Where(Function(s) s.Trim <> "")
Console.WriteLine("Split Result:")
For Each s In result
Console.WriteLine(s)
Next
Console.WriteLine("Matches:")
For Each m As Match In Regex.Matches(input, pattern)
Console.WriteLine(m.Groups("Value").Value)
Next
''# to get string arrays use either of these instead
Dim splitArray As String() = Regex.Split(input, pattern) _
.Where(Function(s) s.Trim <> "") _
.ToArray()
Dim matchArray As String() = Regex.Matches(input, pattern).Cast(Of Match) _
.Select(Function(m) m.Groups("Value").Value) _
.ToArray()