Rails Regexp::IGNORECASE 同时将精确选项与结果中包含的数字选项匹配

Rails Regexp::IGNORECASE while matching exact options with number options also included in the results

我想用精确的字符串匹配两个数组之间的选项。

options = ["arish1", "arish2", "ARISH3", "arish 2", "arish"]
choices = ["Arish"]
final_choice = options.grep(Regexp.new(choices.join('|'), Regexp::IGNORECASE))
p final_choice

Output:
 ["arish1", "arish2", "ARISH3", "arish 2", "arish"]

but it should be only match "arish"

你需要使用

final_choice = options.grep(/\A(?:#{Regexp.union(choices).source})\z/i)

参见Ruby online demo

注:

  • 正则表达式文字符号比构造函数符号更简洁
  • 您仍然可以在正则表达式文字中使用变量
  • Regexp.union 方法使用 |“或”正则表达式运算符连接 choices 中的备选方案,并根据需要自动[转义项目=37=]
  • \A anchor 匹配stirng的开始,\z匹配stirng的结束。
  • 非捕获组 (?:...) 用于确保锚点分别应用于 choices 中的每个替代项。
  • .source 用于仅从正则表达式中获取 pattern 部分。