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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:57:03