首页 > 解决方案 > .NET:返回给定要匹配的整个单词列表的字符串列表

问题描述

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

输入: word wo wordword

输出(除以word):

字符串1:word

字符串2:[space]wo wordword

输出(除以wo):

字符串1:word[space]

字符串2:wo

字符串3:[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#regexstringmatchstring-matching

解决方案


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

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

在这里,\b(word1|word2)\bpattern 会将拆分词作为整个词进行匹配,并且由于模式中拆分词周围的Regex.Split捕获组 ( ) 将字符串拆分为匹配和不匹配的块。(...)

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

请参阅正则表达式演示

在此处输入图像描述


推荐阅读