Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET正则表达式以拆分多个单词或短语_.net_Vb.net_Regex - Fatal编程技术网

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

.NET正则表达式以拆分多个单词或短语,.net,vb.net,regex,.net,Vb.net,Regex,我使用下面的代码获取一个字符串并将其拆分为一个数组。这将需要:迪斯尼乐园,并使其成为两个独立的元素。如果字符串包含“Disney Land”,则它是数组中的一个元素。虽然效果很好,但每次都会向数组中添加一些空元素。所以我只是迭代元素,如果它们是空的,就删除它们。是否对下面的代码进行了调整,以防止出现这些空元素 Private m_Reg As Regex m_Reg = New Regex("([^""^\s]+)\s*|""([^""]+)""\s*") Dim rezsplit = m_Re

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

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

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

m_Reg = New Regex("""([^""]+)""|[^""\s]+")
编辑:我忘记处理删除报价的问题了。这将使它更容易:

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

现在,无论哪个选项匹配,都可以在名为“Value”的组中找到所需的文本。

Alan的答案是正确的。使用他的模式,我们可以使用LINQ过滤
Split
结果,或者按照他的建议使用
匹配项

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()
Dim输入为String=“冒险岛”“迪士尼乐园”“环球影城”
暗模式为String=“(?[^”“\s]+)|”“(?[^”“]+)”
Dim result=Regex.Split(输入,模式)。其中(函数s.Trim“”)
Console.WriteLine(“拆分结果:”)
对于结果中的每个
控制台写入线(s)
下一个
Console.WriteLine(“匹配:”)
对于Regex.Matches中的每个m As匹配(输入,模式)
Console.WriteLine(m.Groups(“Value”).Value)
下一个
“”#要获取字符串数组,请使用这两种方法之一
Dim splitArray As String()=Regex.Split(输入,模式)_
.其中(功能s.修剪“”)_
.ToArray()
Dim matchArray As String()=Regex.Matches(输入,模式).Cast(匹配的)_
.选择(功能(m)m.组(“值”).值)_
.ToArray()

我正在尝试,但它返回了一个匹配项集合。我需要一个字符串()。我尝试了ctype,然后尝试了copyto方法。我不知道如何在不迭代集合的情况下使其成为字符串。我已经在迭代集合以消除空字符串,所以我希望避免这种情况。我对.NET不太熟悉,但如果没有办法将MatchCollection修饰为字符串数组,我会非常惊讶。林克,也许吧?