我如何告诉我的正则表达式从字符串数组中选择?

How do I tell my regex to pick from an array of strings?

我正在使用 Rails 5. 我想替换字符串中出现的任意数量的数字、可选数量的空格、字符串数组中的标记、可选数量的空格, 和任意数量的数字。因此,例如,这将匹配我的模式....

123 / 2221111

或这个

 102849/222

所以我认为我的正则表达式应该是

re = /\d+[[:space:]]*[#{Regexp.union(TOKENS)}][[:space:]]*\d+/

但以下匹配的内容不符合条件...

2.4.0 :015 > re = /\d+[[:space:]]*[#{Regexp.union(TOKENS)}][[:space:]]*\d+/
 => /\d+[[:space:]]*[(?-mix:of|\/)][[:space:]]*\d+/
2.4.0 :016 > TOKENS
 => ["of", "/"]
2.4.0 :017 > name = "10F 2017"
 => "10F 2017"
2.4.0 :018 > name.gsub!(re, '#')
 => "#"

字符串“10F 2017”不包含我的 TOKENS 数组中的任何字符串,因此应该会失败。如何重写我的正则表达式,使其只匹配我想要的内容?

通过将 #{Regexp.union(TOKENS)} 包含在字符 class、[(?-mix:of|\/)] 中,您使其匹配单个字符:(,字符范围为 ?mi等。?m之间的范围匹配:

并查看 what parts of the string each part of your regex matches:

因此,[(?-mix:of|\/)] 在您的输入字符串中匹配 F

您需要删除 []:

re = /\d+[[:space:]]*#{Regexp.union(TOKENS)}[[:space:]]*\d+/

Ruby demo