我需要通过一组完整的单词将字符串拆分为子字符串。
输入: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);
问题是我没有像换行符那样维护任何空格,而是用空格替换它们。
如果您的分词单词只是字母数字或下划线字符的条纹,您可以使用
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))
将过滤掉在匹配发生时通常出现的空字符串是连续匹配或字符串的开头/结尾。