.NET:返回给定要匹配的整个单词列表的字符串列表

Posted

技术标签:

【中文标题】.NET:返回给定要匹配的整个单词列表的字符串列表【英文标题】:.NET: Return a list of strings given a list of whole words to match 【发布时间】:2019-08-10 14:02:17 【问题描述】:

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

输入: 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);

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

【问题讨论】:

这是意向声明,不是问题。还要指定是否要区分大小写。以及您使用可测试示例尝试过的任何代码 *** 不是编码服务,需求列表不是问题。你到底在哪里卡住了,你实际的编程相关问题是什么?声誉 > 1000 分,我希望您知道这一点... @MichaelRandall 如果这听起来像一个意图,我很抱歉。我确实尝试了很多东西,但我不想发布复杂的代码来迷惑人们。我不在乎区分大小写。 恰恰相反,它帮助我们复制代码、测试和调整。尤其是输入列表和预期结果 @MichaelRandall 我已经在问题的开头提供了一个示例输入和输出列表。我会补充更多。它基本上是根据不区分大小写的精确整个单词匹配来拆分文本。 【参考方案1】:

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

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

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

.Where(s =&gt; !string.IsNullOrEmpty(s)) 将过滤掉通常出现在连续匹配或字符串开头/结尾处的空字符串。

见regex demo:

【讨论】:

谢谢。在您的示例中,如果我们使用 .Where(s =&gt; !string.IsNullOrWhiteSpace(s)) 而不是 null 或空,会有什么不同吗?拆分词当前的编写方式是,对于每个字符 IsLetterOrDigit(Char) 必须返回 true,但第一个字符除外,因为它是 @ 或 #。 @user246392 如果您需要非描述性拆分,请使用IsNullOrEmpty,如果您只想丢失空格,请使用IsNullOrWhiteSpace。其余的我不清楚。如果您在第一个 \b 之后使用 (?&lt;![@#])lookbehind,则可以避免提及和主题标签。

以上是关于.NET:返回给定要匹配的整个单词列表的字符串列表的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 如何返回某些行与给定列表匹配的整个行集

匹配字谜并推送到数组

字谜不匹配(字符串到列表),Python

返回单词列表中可以用输入字符的子集组成的所有单词的集合

如何从单词列表中查找 DF 中的匹配单词并在新列中返回匹配的单词 [重复]

2021-10-16:单词拆分 II。给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。