首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET:返回一个字符串列表,给出要匹配的全部单词列表

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

Stack Overflow用户
提问于 2019-03-19 23:05:57
回答 1查看 100关注 0票数 0

我需要用一组完整的单词把字符串拆分成子串。

输入:word wo wordword

输出(由拆分)

str1:word

str2:[space]wo wordword

输出(由拆分)

str1:word[space]

str2:wo

str3:[space]wordword

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

代码语言:javascript
复制
public List<string> GetPhrases(string text, List<string> splitters);

考虑因素:

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

使用这种方法,我将能够在UI窗口中高亮显示整个单词匹配,并且能够匹配多个具有不同高光的单词,但我不能使用regex来环绕我的头脑。

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

代码语言:javascript
复制
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);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-20 00:00:06

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

代码语言:javascript
复制
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演示

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

https://stackoverflow.com/questions/55251241

复制
相关文章

相似问题

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