我需要用一组完整的单词把字符串拆分成子串。
输入:word wo wordword
输出(由拆分)
str1:word
str2:[space]wo wordword
输出(由拆分)
str1:word[space]
str2:wo
str3:[space]wordword
所需方法的方法签名应该如下所示:
public List<string> GetPhrases(string text, List<string> splitters);考虑因素:
使用这种方法,我将能够在UI窗口中高亮显示整个单词匹配,并且能够匹配多个具有不同高光的单词,但我不能使用regex来环绕我的头脑。
目前,我有一个非正则表达式的解决方案,但它不是很好:
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);问题是,我没有像换行符那样维护任何空格,而是用一个空格替换它们。
发布于 2019-03-20 00:00:06
如果拆分词只是字母数字或下划线字符的条纹,您可以使用
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演示

https://stackoverflow.com/questions/55251241
复制相似问题