在结果中保留分隔符的最简单方法是使用Regex.Split method 并在组 中使用alternation 构造模式。该组是将分隔符包含在结果中的关键,否则它将删除它们。该模式看起来像(word1|word2|wordN),括号用于分组。此外,您应该始终使用Regex.Escape method 对每个单词进行转义,以避免将它们错误地解释为正则表达式元字符。
我还建议阅读我对类似问题的回答(以及其他人的回答)以了解更多详情:How do I split a string by strings and include the delimiters using .NET?
由于我用 C# 回答了这个问题,这里有一个 VB.NET 版本:
Dim input As String = "I am trying to split a long string based on an array of words."
Dim words As String() = { "trying", "long", "array" }
If (words.Length > 0)
Dim pattern As String = "(" + String.Join("|", words.Select(Function(s) Regex.Escape(s)).ToArray()) + ")"
Dim result As String() = Regex.Split(input, pattern)
For Each s As String in result
Console.WriteLine(s)
Next
Else
' nothing to split '
Console.WriteLine(input)
End If
如果您需要修剪每个要拆分的单词周围的空格,您可以为模式添加前缀和后缀 \s* 以匹配周围的空格:
Dim pattern As String = "\s*(" + String.Join("|", words.Select(Function(s) Regex.Escape(s)).ToArray()) + ")\s*"
如果您使用的是 .NET 4.0,则可以将 ToArray() 调用放在 String.Join 方法中。
编辑:顺便说一句,您需要预先决定拆分的工作方式。它应该匹配单个单词还是其他单词的子字符串?例如,如果您的输入中包含单词 “belong”,则上述解决方案将拆分为“long”,从而产生 {"be", "long"}。这是想要的吗?如果不是,那么对模式的微小更改将确保拆分匹配完整的单词。这是通过用字边界\b 元字符包围模式来实现的:
Dim pattern As String = "\s*\b(" + String.Join("|", words.Select(Function(s) Regex.Escape(s)).ToArray()) + ")\b\s*"
\s* 根据我之前提到的修剪是可选的。