You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

现有字典匹配代码仅支持完全匹配,如何实现子串匹配并返回首个对应值?

解决字符串包含字典键子串时返回对应值的问题

你的核心问题在于原代码用了**完全相等(==)**的判断逻辑,只能匹配和字典键完全一致的输入,没法处理“输入包含键作为子串”的场景。另外你还需要优先返回第一个出现的匹配项,我们可以调整逻辑来实现这个需求:

改进后的代码

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;
}

代码逻辑说明

  1. 空输入处理:先判断输入是否为空或全是空白字符,直接返回空字符串,避免后续操作出现异常。
  2. 大小写归一化:把输入转成大写并去除首尾空格,和你字典里的键(都是大写格式)保持一致,确保不管输入是小写、混合大小写都能正确匹配。
  3. 筛选匹配项:找出所有存在于输入字符串中的字典键,同时用IndexOf记录每个键在输入中的首次出现位置。
  4. 排序取第一个:按出现位置从小到大排序,取排在第一位的匹配项对应的字典值,没有匹配项则返回空。

测试你的示例

  • 输入"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:22:28