.NET:返回一个字符串列表,给出一个匹配的整个单词列表

问题描述 投票:0回答:1

我需要通过一组完整的单词将字符串拆分为子字符串。

输入:word wo wordword

输出(由word分割):

STR1:word

STR2:[space]wo wordword

输出(由wo分割):

STR1:word[space]

STR2:wo

str3:[space]wordword

所需方法的方法签名应如下所示:

public List<string> GetPhrases(string text, List<string> splitters);

注意事项:

  • 整个单词只匹配
  • 应该保留空格
  • 拆分器列表仅包含不同的单词
  • 拆分器不包含空格
  • 匹配应该不区分大小写

使用这种方法,我将能够在UI窗口中突出显示整个单词匹配,并能够匹配具有不同高光的多个单词,但我无法用正则表达式来解决问题。

目前,我有一个非正则表达式解决方案,但它不是很好:

var words = Regex.Split(text, @"\s+").Where(s => s != string.Empty).ToList();
var str = "";
var list = new List<string>();

foreach (var word in words)
{
    if (!splitters.Contains(word))
    {
        if(words.IndexOf(word) != words.Count - 1)
            str += word + " ";
        else
            str += word;
    }
    else
    {
        if(!string.IsNullOrWhitespace(str))
           list.Add(str);

        list.Add(word);
        str = "";
    }
}

if(!string.IsNullOrWhitespace(str))
   list.Add(str);

问题是我没有像换行符那样维护任何空格,而是用空格替换它们。

c# regex string match string-matching
1个回答
2
投票

如果您的分词单词只是字母数字或下划线字符的条纹,您可以使用

var results = Regex.Split(s, $@"\b({string.Join("|", splitters)})\b")
                   .Where(s => !string.IsNullOrEmpty(s))

这里,\b(word1|word2)\b模式将分割器单词作为整个单词匹配,并且Regex.Split将字符串拆分为匹配和不匹配的块,因为模式中的分割器单词周围的捕获组((...))。

.Where(s => !string.IsNullOrEmpty(s))将过滤掉在匹配发生时通常出现的空字符串是连续匹配或字符串的开头/结尾。

regex demo

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.