我正试图根据一组单词来分割一个长字符串。例如:
词:尝试,长,排列
句子:“我正试图根据一组单词来分割一个长字符串。”
产生的字符串数组:
基于am
同一个单词可能有多个实例,因此可能会出现两个尝试导致拆分或数组的实例。
在.NET中有什么简单的方法可以做到这一点吗?
发布于 2010-12-15 15:19:54
将分隔符保留在结果中的最简单方法是使用Regex.Split method并在组中使用交替构造模式。组是将分隔符作为结果的一部分的关键,否则它将删除它们。该模式看起来类似于(word1|word2|wordN),括号用于分组。此外,您应该使用Regex.Escape method对每个单词进行转义,以避免将它们错误地解释为regex。
我还建议阅读我对类似问题的回答(以及其他人的答案),以了解更多细节: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,则可以在String.Join方法中删除ToArray()调用。
编辑: BTW,您需要预先决定您希望拆分如何工作。它应该匹配单个单词还是作为其他单词的子字符串的单词?例如,如果您的输入中有单词“属于”,那么上面的解决方案将分裂为"long",从而导致{"be", "long"}。这是想要的吗?如果没有,则对模式的小改动将确保拆分后的单词匹配完整。这是通过用一个字边界\b元字符包围模式来实现的:
Dim pattern As String = "\s*\b(" + String.Join("|", words.Select(Function(s) Regex.Escape(s)).ToArray()) + ")\b\s*"\s*是可选的,根据我前面提到的修剪。
发布于 2010-12-15 14:46:10
您可以使用正则表达式。
(.*?)((?:trying)|(?:long)|(?:array))(.*)如果匹配的话会给你三个组:
。
你可以继续在(3)上进行匹配,直到你的火柴用完。
我玩过这个游戏,但是我找不到一个在目标单词的所有实例上分裂的正则表达式。也许有更多的人能解释一下。
我假设VB有regex支持。如果没有,我建议使用另一种语言。当然,C#是有规则的。
发布于 2010-12-15 14:21:30
您可以使用“”进行拆分,而不是遍历“拆分词”数组中包含的单词。
https://stackoverflow.com/questions/4450842
复制相似问题