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

如何查找含通配符的字符串子串?#匹配数字%匹配任意ASCII字符

带自定义通配符的子串查找实现方案

思路可行性判断

你的思路完全可行。通过定位通配符前的固定字符作为锚点,能快速缩小主串中需要验证的范围,避免无意义的全量遍历,尤其是当通配符不在子串开头时,这种锚点定位的方法能显著提升匹配效率。

具体实现步骤

1. 拆分模式串的固定段与通配符段

先把目标子串(模式串)拆分为「固定字符段」和「通配符段」的组合。比如模式串abc#%def,可拆分为abc、#、%、def;如果模式串开头就是通配符(如#%xyz),则从主串的起始位置开始逐一尝试匹配。

2. 定位主串中的锚点位置

遍历主串,找到所有与模式串中第一个固定段匹配的位置。比如模式串第一个固定段是abc,就先在主串里找出所有abc出现的索引,这些索引就是后续匹配的起始锚点。

3. 从锚点开始逐段验证匹配

针对每个锚点,从模式串的对应位置开始,逐个验证字符:

  • 遇到#:检查主串当前位置是否为数字(0-9),是则继续,否则跳过当前锚点。
  • 遇到%:直接跳过主串当前字符(匹配任意ASCII),继续下一个字符的验证。
  • 遇到普通字符:检查主串当前位置的字符是否完全相等,相等则继续,否则跳过当前锚点。
  • 若模式串所有字符都验证通过,说明找到匹配子串,记录当前锚点的起始位置。

代码示例(Python)

def find_custom_wildcard_substring(main_str, pattern):
    matches = []
    pattern_len = len(pattern)
    main_len = len(main_str)
    
    if pattern_len == 0 or pattern_len > main_len:
        return matches
    
    # 找到模式中第一个连续固定字符段
    fixed_start = 0
    while fixed_start < pattern_len and pattern[fixed_start] in ['#', '%']:
        fixed_start += 1
    if fixed_start == pattern_len:
        # 模式全是通配符,返回所有符合长度的起始索引
        return list(range(main_len - pattern_len + 1))
    
    fixed_end = fixed_start
    while fixed_end < pattern_len and pattern[fixed_end] not in ['#', '%']:
        fixed_end += 1
    anchor_segment = pattern[fixed_start:fixed_end]
    anchor_len = len(anchor_segment)
    
    # 遍历主串找所有锚点并验证
    for i in range(main_len - pattern_len + 1):
        # 检查锚点匹配
        if main_str[i + fixed_start:i + fixed_start + anchor_len] != anchor_segment:
            continue
        # 验证整个模式
        match_flag = True
        main_ptr = i
        pattern_ptr = 0
        while pattern_ptr < pattern_len and main_ptr < main_len:
            p_char = pattern[pattern_ptr]
            m_char = main_str[main_ptr]
            if p_char == '#':
                if not m_char.isdigit():
                    match_flag = False
                    break
                main_ptr += 1
                pattern_ptr += 1
            elif p_char == '%':
                main_ptr += 1
                pattern_ptr += 1
            else:
                if p_char != m_char:
                    match_flag = False
                    break
                main_ptr += 1
                pattern_ptr += 1
        if match_flag and pattern_ptr == pattern_len:
            matches.append(i)
    return matches

# 测试
main_str = "abc123xyz789"
pattern = "abc#%xyz"
print(find_custom_wildcard_substring(main_str, pattern))  # 输出 [0]

边界情况处理

  • 当模式串长度大于主串长度时,直接返回空列表。
  • 当模式串全为通配符时,主串中所有长度与模式串一致的子串都视为匹配。

内容的提问来源于stack exchange,提问作者Jacob Hakala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:11:11