2010-03-19 65 views
2

我正在使用下面的代码来获取一个字符串并将其分成一个数组。它将采取:迪斯尼乐园并将其分为两个独立的元素。如果字符串包含“迪斯尼乐园”,那么它就是数组中的一个元素。很好用,但它每次都会为数组添加一些空元素。所以我只是遍历元素,如果它们是空的,就将它们移除。是否对下面的代码进行了调整,以防止这些空元素发生?.NET正则表达式来分割多个单词或短语

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

回答

2

Alan的回答是正确的。使用他的模式,我们可以使用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() 
+0

非常感谢你。 – 2010-03-20 21:23:23

+0

@Cj很高兴帮助:) – 2010-03-20 22:08:17

2

使用Matches而不是Split,你将不必担心。你也可以简化正则表达式:

m_Reg = New Regex("""([^""]+)""|[^""\s]+") 

编辑:我忘了处理刮报价的问题。这将使它更容易:

m_Reg = New Regex("""(?<Value>[^""]+)""|(?<Value>[^""\s]+)") 

现在,无论哪种替代匹配,可在名为“值”的组中找到所需的文本。

+0

我正在尝试它,但它返回一个匹配集合。我需要一个String()。我试过ctype,然后尝试copyto方法。我不知道如何在没有迭代集合的情况下将它变成一个字符串。我已经在迭代集合以摆脱空串,所以我希望避免这种情况。 – 2010-03-19 21:41:21

+0

我在.NET中并不流利,但如果没有将MatchCollection作为String数组装饰的方法,我会感到非常惊讶。 Linq,也许? – 2010-03-19 22:05:05

+0

+1。我发布了.NET方法。 – 2010-03-19 23:54:52