.NET正则表达式分割多个单词或短语

时间:2010-03-19 15:36:03

标签: .net vb.net regex

我正在使用下面的代码取一个字符串并将其拆分为一个数组。它将采取:迪斯尼乐园,并使其成为两个独立的元素。如果字符串包含“Disney Land”,则它是数组中的一个元素。效果很好,但每次都会向数组中添加一些空元素。所以我只是迭代元素并删除它们,如果它们是空的。是否对下面的代码进行了调整,以防止出现这些空元素?

Private m_Reg As Regex
m_Reg = New Regex("([^""^\s]+)\s*|""([^""]+)""\s*")
Dim rezsplit = m_Reg.Split(criteria)

2 个答案:

答案 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()