是否可以连接两个正则表达式变量?

时间:2017-01-18 07:35:10

标签: ruby regex

是否可以在Ruby中连接两个正则表达式变量?

r1 = /my_str/
r2 = /my_str1/
r3 = r1+r2

任何人都可以提出任何建议吗?

5 个答案:

答案 0 :(得分:4)

Regexp::union

r1 = /my_str/
r2 = /my_str1/
r3 = Regexp.union(r1, r2)

答案 1 :(得分:1)

连接Vector并传递到std::array<float, 4>

source

答案 2 :(得分:0)

以下方法在Ruby中有效-但我认为它并不漂亮:

2.5.3 :001 > r1 = /my_str1/
 => /my_str/
2.5.3 :002 > r2 = /my_str2/
 => /my_str1/
2.5.3 :003 > r3 = Regexp.new( "#{r1.source}|#{r2.source}" )
 => /my_str1|my_str2/

当然,您甚至可以自己在Regexp上实现+,但是这样(但当然完全不建议^^):

class Regexp
  def +(regexp)
    self.class.new("#{source}|#{regexp.source}")
  end
end

那么您可以做:

2.5.3 :004 >     class Regexp
2.5.3 :005?>       def +(regexp)
2.5.3 :006?>         self.class.new("#{source}|#{regexp.source}")
2.5.3 :007?>       end
2.5.3 :008?>     end
 => :+
2.5.3 :009 > r1 + r2
 => /my_str1|my_str2/

当然有原因,为什么不执行。我只是假设a或as串联(至少应该在任何情况下都可以工作-即使在Regexp中定义了大多数建议的明确开始和结束位置也是如此)。但最有可能的是您有一些非常不同的用例。因此,当您想以不同的方式进行连接时,可能必须确保在第一个正则表达式\Z和第二个\A中都必须删除...

答案 3 :(得分:0)

与其他答案相反,不一定要致电source;在许多情况下,Regexp#to_s也可以正常工作。从文档中:

返回一个包含正则表达式及其选项的字符串(使用?(opts:source)表示法。此字符串可以反馈到:: new到具有与原始语义相同的正则表达式。

通常只使用字符串插值就足够了:

r1 = /my_str1/
# => /my_str1/ 
r2 = /my_str2/
# => /my_str2/ 
r3 = Regexp.new("#{r1}|#{r2}")
# => /(?-mix:my_str1)|(?-mix:my_str2)/ 

结果比/my_str1|my_str2/可读性差,但匹配程度相同-权衡是可读性较差的正则表达式的更易理解的来源。

也就是说,如果您要对组合表达式(或其一部分)应用与原始表达式不同的选项,则需要调用source

r1 = /[a-z]\n[0-9]/
r2 = /[0-9]\n[a-z]/

r3 = Regexp.new("(?mi-x:(#{r1.source}|#{r2.source}))")
# => /(?mi-x:([a-z]\n[0-9]|[0-9]\n[a-z]))/
r3.match("A\n1")
# => #<MatchData "A\n1" 1:"A\n1">        <-- works

r4 = Regexp.new("(?mi-x:(#{r1}|#{r2}))")
# => /(?mi-x:((?-mix:[a-z]\n[0-9])|(?-mix:[0-9]\n[a-z])))/ 
r4.match("A\n1")
# => nil                                 <-- doesn't work b/c wrong options

答案 4 :(得分:-1)

如果你有两个正则表达式,你可以像这样连接它们:

  

var r1 = / my_str /;

     

var r2 = / my_str1 /;

     

var r3 = new RegExp(r1.source + r2.source);

相关问题