如何查找含通配符的字符串子串?#匹配数字%匹配任意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
相关产品推荐
相关产品推荐

