.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 => !string.IsNullOrEmpty(s))
将过滤掉通常出现在连续匹配或字符串开头/结尾处的空字符串。
见regex demo:
【讨论】:
谢谢。在您的示例中,如果我们使用.Where(s => !string.IsNullOrWhiteSpace(s))
而不是 null 或空,会有什么不同吗?拆分词当前的编写方式是,对于每个字符 IsLetterOrDigit(Char)
必须返回 true,但第一个字符除外,因为它是 @ 或 #。
@user246392 如果您需要非描述性拆分,请使用IsNullOrEmpty
,如果您只想丢失空格,请使用IsNullOrWhiteSpace
。其余的我不清楚。如果您在第一个 \b
之后使用 (?<![@#])
lookbehind,则可以避免提及和主题标签。以上是关于.NET:返回给定要匹配的整个单词列表的字符串列表的主要内容,如果未能解决你的问题,请参考以下文章
如何从单词列表中查找 DF 中的匹配单词并在新列中返回匹配的单词 [重复]
2021-10-16:单词拆分 II。给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。