c# - .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);
问题是我没有像换行符那样维护任何空格,而是用空格替换它们。
解决方案
如果您的分隔词只是字母数字或下划线字符的条纹,您可以使用
var results = Regex.Split(s, $@"\b({string.Join("|", splitters)})\b")
.Where(s => !string.IsNullOrEmpty(s))
在这里,\b(word1|word2)\b
pattern 会将拆分词作为整个词进行匹配,并且由于模式中拆分词周围的Regex.Split
捕获组 ( ) 将字符串拆分为匹配和不匹配的块。(...)
将.Where(s => !string.IsNullOrEmpty(s))
过滤掉通常在匹配发生时出现的空字符串是连续匹配或字符串的开头/结尾。
请参阅正则表达式演示:
推荐阅读
- reactjs - 如何在反应本机应用程序中翻译来自服务器的消息
- laravel - 无法创建 Laravel 关系
- security - .net core 中的 asp.net webform 替换 Session 是什么?
- react-redux - 在事件处理函数中传递值后,动作调度不起作用
- r - 根据分位数的接近程度更改向量的值
- java - Java - ImageIcon 不重新加载更新文件
- php - Wordpress CF7 根据所选主题直接发送电子邮件
- nodemailer - 我们可以使用 nodemailer 将动态加载的 html 文件作为电子邮件发送吗
- redirect - cmd.exe 和重定向的有趣观察
- c++ - C++ ifstream XCode / VSCode