首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个单词上拆分字符串,并跟踪哪个单词在哪里拆分它

问在多个单词上拆分字符串,并跟踪哪个单词在哪里拆分它
EN

Stack Overflow用户
提问于 2010-12-15 14:16:58
回答 6查看 3.6K关注 0票数 1

我正试图根据一组单词来分割一个长字符串。例如:

词:尝试,长,排列

句子:“我正试图根据一组单词来分割一个长字符串。”

产生的字符串数组:

基于am

  • trying

  • to a

  • long

  • string的
  • I

同一个单词可能有多个实例,因此可能会出现两个尝试导致拆分或数组的实例。

在.NET中有什么简单的方法可以做到这一点吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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版本:

代码语言:javascript
复制
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*,以匹配周围的空格:

代码语言:javascript
复制
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元字符包围模式来实现的:

代码语言:javascript
复制
Dim pattern As String = "\s*\b(" + String.Join("|", words.Select(Function(s) Regex.Escape(s)).ToArray()) + ")\b\s*"

\s*是可选的,根据我前面提到的修剪。

票数 2
EN

Stack Overflow用户

发布于 2010-12-15 14:46:10

您可以使用正则表达式。

代码语言:javascript
复制
(.*?)((?:trying)|(?:long)|(?:array))(.*)

如果匹配的话会给你三个组:

  • 1)任何拆分词的第一个实例之前的位。
  • 2)拆分词本身。
  • 3)字符串的其余部分。

。

你可以继续在(3)上进行匹配,直到你的火柴用完。

我玩过这个游戏,但是我找不到一个在目标单词的所有实例上分裂的正则表达式。也许有更多的人能解释一下。

我假设VB有regex支持。如果没有,我建议使用另一种语言。当然,C#是有规则的。

票数 1
EN

Stack Overflow用户

发布于 2010-12-15 14:21:30

您可以使用“”进行拆分,而不是遍历“拆分词”数组中包含的单词。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4450842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档