如何使用Ruby实现任意模式字符串与对应输入字符串的匹配
Ruby 模式匹配函数实现方案
核心思路
你不需要先单独拆分单词数组,可直接根据输入的模式串动态构建带反向引用的正则表达式,一次完成匹配校验,同时可以直接从匹配结果中提取拆分后的单词数组。
动态正则构建逻辑
遍历模式串的每个字符:
- 首次出现的字符,对应新建一个捕获组
(\w+),记录该字符和捕获组编号的映射关系 - 重复出现的字符,直接引用对应编号的已存在捕获组,格式为
\编号
比如模式abab最终生成的正则为^(\w+)(\w+)\1\2$,其中\1对应第一个捕获组(模式中a对应的单词),\2对应第二个捕获组(模式中b对应的单词)。
完整代码实现
def pattern_match?(pattern, input_str) char_to_group = {} current_group_num = 1 # 拼接正则字符串 regex_pattern = pattern.chars.each_with_object('^') do |char, str| if char_to_group.key?(char) str << "\\#{char_to_group[char]}" else char_to_group[char] = current_group_num current_group_num += 1 str << "(\\w+)" end end + '$' match_result = input_str.match(Regexp.new(regex_pattern)) return false unless match_result # 若需要获取拆分后的单词数组,打开下方注释即可 # word_array = pattern.chars.map { |c| match_result[char_to_group[c]] } true end
测试示例
- 调用
pattern_match?("abab", "dogcatdogcat")返回true,拆分得到的单词数组为["dog", "cat", "dog", "cat"] - 调用
pattern_match?("aabb", "carcarhousehouse")返回true,拆分得到的单词数组为["car", "car", "house", "house"] - 调用
pattern_match?("aaaa", "testtesttesttest")返回true
适配调整说明
如果待匹配的单词包含非字母数字下划线的字符(比如中文、特殊符号),可以将正则中的
\w替换为对应字符范围:
- 中文场景替换为
\p{Han}- 任意非空格字符替换为
\S
内容的提问来源于stack exchange,提问作者rowingdan
相关产品推荐
相关产品推荐

