现有字典匹配代码仅支持完全匹配,如何实现子串匹配并返回首个对应值?
解决字符串包含字典键子串时返回对应值的问题
你的核心问题在于原代码用了**完全相等(==)**的判断逻辑,只能匹配和字典键完全一致的输入,没法处理“输入包含键作为子串”的场景。另外你还需要优先返回第一个出现的匹配项,我们可以调整逻辑来实现这个需求:
改进后的代码
private string GetSuffix(string input) { // 先处理空输入的情况,避免后续报错 if (string.IsNullOrWhiteSpace(input)) return string.Empty; // 统一转成大写,消除大小写差异的影响 string normalizedInput = input.ToUpper().Trim(); // 筛选出所有在输入中存在的字典键,同时记录每个键的首次出现位置 var matchingEntries = PropStreetSuffixDict .Where(entry => normalizedInput.Contains(entry.Key)) .Select(entry => new { entry.Key, entry.Value, FirstOccurrencePosition = normalizedInput.IndexOf(entry.Key) }) // 按首次出现位置排序,确保第一个出现的匹配项排在最前面 .OrderBy(item => item.FirstOccurrencePosition); // 取第一个匹配项的值,没有匹配项则返回空字符串 return matchingEntries.FirstOrDefault()?.Value ?? string.Empty; }
代码逻辑说明
- 空输入处理:先判断输入是否为空或全是空白字符,直接返回空字符串,避免后续操作出现异常。
- 大小写归一化:把输入转成大写并去除首尾空格,和你字典里的键(都是大写格式)保持一致,确保不管输入是小写、混合大小写都能正确匹配。
- 筛选匹配项:找出所有存在于输入字符串中的字典键,同时用
IndexOf记录每个键在输入中的首次出现位置。 - 排序取第一个:按出现位置从小到大排序,取排在第一位的匹配项对应的字典值,没有匹配项则返回空。
测试你的示例
- 输入
"CHURCH ACROSS ROAD":归一化后是"CHURCH ACROSS ROAD",匹配到键"ROAD",返回"RD"。 - 输入
"STREET CHURCH ACROSS ROAD":归一化后匹配到"STREET"(位置0)和"ROAD"(位置19),排序后"STREET"在前,返回"ST",完全符合你的需求。
可选:整词匹配(如果需要)
如果你的需求是仅当字典键作为独立单词出现时才匹配(比如不想匹配"CHURCHROAD"里的"ROAD"),可以用正则表达式实现整词匹配,修改后的代码如下(需要引用using System.Text.RegularExpressions;):
private string GetSuffix(string input) { if (string.IsNullOrWhiteSpace(input)) return string.Empty; string normalizedInput = input.ToUpper().Trim(); var matchingEntries = PropStreetSuffixDict .Select(entry => { // 用正则匹配整词,\b表示单词边界,Escape避免键里有特殊字符报错 var match = Regex.Match(normalizedInput, $@"\b{Regex.Escape(entry.Key)}\b"); return new { entry.Value, IsMatch = match.Success, Position = match.Success ? match.Index : int.MaxValue }; }) .Where(item => item.IsMatch) .OrderBy(item => item.Position); return matchingEntries.FirstOrDefault()?.Value ?? string.Empty; }
内容的提问来源于stack exchange,提问作者WorksOnMyLocal
相关产品推荐
相关产品推荐

