C#实现文本子串高亮功能无法匹配子串问题求助
问题根因
你代码的核心问题出在正则表达式的\b元字符约束:\b是单词边界匹配符,仅会匹配单词字符(字母、数字、下划线)与非单词字符的交界位置,因此只有当你要匹配的内容是独立完整单词时才会命中,无法匹配长文本中嵌入的子串。
修复方案
1. 移除正则里的单词边界约束,同时新增特殊字符转义处理
修改RenderResultSubString方法中的正则规则,去掉两侧的\b,同时用Regex.Escape处理输入的子串,避免子串包含.、*等正则特殊字符时出现匹配异常:
public TextGramaticaItemPublic RenderResultSubString(TextGramaticaItemPublic a, string substr) { // 移除\b约束,先转义待匹配子串避免正则特殊字符问题 a.Content = Regex.Replace(a.Content, Regex.Escape(substr), new MatchEvaluator(ReplaceKeyWords), RegexOptions.IgnoreCase); return a; }
2. 可选:修正大小写匹配不一致问题
你外层遍历的判断逻辑用了a.Content.Contains(word),该方法默认区分大小写,但正则替换用了RegexOptions.IgnoreCase忽略大小写,两者逻辑不一致可能出现部分可被正则匹配的内容漏处理。可以直接去掉外层的if判断,Regex.Replace在无匹配项时不会修改原内容,不会有额外性能损耗。修改后的遍历逻辑:
texts.ForEach((a) => { RenderResultSubString(a, word); });
如果需要保留预判断优化性能,可以把判断逻辑改为不区分大小写的版本:
texts.ForEach((a) => { if (a.Content.IndexOf(word, StringComparison.OrdinalIgnoreCase) >= 0) { RenderResultSubString(a, word); } });
内容的提问来源于stack exchange,提问作者MadDev
相关产品推荐
相关产品推荐

