是否可以在Ruby中连接两个正则表达式变量?
r1 = /my_str/
r2 = /my_str1/
r3 = r1+r2
任何人都可以提出任何建议吗?
答案 0 :(得分:4)
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);