如何通过LINQ优雅判断搜索字符串是否为数组字符串的不完整匹配
解决方案
核心思路
我们需要排除数组中所有包含**"ABC HG"后紧跟非空白字符**的字符串(这类属于你定义的“不完整匹配”)。核心步骤:
- 标准化搜索输入:把带空格/不带空格的搜索词统一转换成数组中存在的带空格格式(比如
ABCHG转成ABC HG)。 - 过滤逻辑:检查每个字符串,若包含
ABC HG且其后紧跟非空白字符,则排除该字符串;否则保留。
实现方式
方式一:正则表达式(简洁高效)
string[] strings = { "This is not ABC HGL", "I am going to ABC HGL", "What is ABC HGT", "Excellent ABC HGU", "I like ABC HG" // 符合条件的条目 }; string searchInput = "ABCHG"; // 可替换为"ABC HG" // 标准化搜索词为带空格格式 string standardSearch = searchInput.Contains(" ") ? searchInput : searchInput.Insert(3, " "); // 针对ABC+HG的固定结构拆分 // 构建正则:匹配"ABC HG"后紧跟非空白字符的模式 var excludePattern = new Regex(Regex.Escape(standardSearch) + @"\S"); // LINQ过滤:排除所有匹配模式的字符串 var result = strings.Where(s => !excludePattern.IsMatch(s)).ToArray();
执行后,result仅保留"I like ABC HG",其余不完整匹配的条目被排除。
方式二:纯字符串操作(无正则依赖)
如果不想依赖正则,可通过字符串索引检查实现:
string[] strings = { "This is not ABC HGL", "I am going to ABC HGL", "What is ABC HGT", "Excellent ABC HGU", "I like ABC HG" }; string searchInput = "ABC HG"; string standardSearch = searchInput.Contains(" ") ? searchInput : searchInput.Insert(3, " "); int searchLen = standardSearch.Length; var result = strings.Where(s => { int index = s.IndexOf(standardSearch); while (index != -1) { int nextIndex = index + searchLen; // 检查"ABC HG"后是否有非空白字符 if (nextIndex < s.Length && !char.IsWhiteSpace(s[nextIndex])) { return false; } index = s.IndexOf(standardSearch, index + searchLen); } return true; }).ToArray();
说明
- 标准化步骤确保无论搜索输入带不带空格,都能和数组中带空格的目标字符串对齐。
- 两种方式都能精准排除“ABC HG”后紧跟其他字符的不完整匹配,只保留完全匹配“ABC HG”(其后无有效字符)的条目。
内容的提问来源于stack exchange,提问作者matrixnew
相关产品推荐
相关产品推荐

