开发者

Ruby Regexp: difference between new and union with a single regexp

开发者 https://www.devze.com 2023-04-13 03:34 出处:网络
I have simplified the examples. Say I have a string containing the code for a regex. I would like the regex to m开发者_如何学Catch a literal dot and thus I want it to be:

I have simplified the examples. Say I have a string containing the code for a regex. I would like the regex to m开发者_如何学Catch a literal dot and thus I want it to be:

\.

So I create the following Ruby string:

"\\."

However when I use it with Regexp.union to create my regex, I get this:

irb(main):017:0> Regexp.union("\\.")
=> /\\\./

That will match a slash followed by a dot, not just a single dot. Compare the previous result to this:

irb(main):018:0> Regexp.new("\\.")
=> /\./

which gives the Regexp I want but without the needed union.

Could you explain why Ruby acts like that and how to make the correct union of regexes ? The context of utilization is that of importing JSON strings describing regexes and union-ing them in Ruby.


Passing a string to Regexp.union is designed to match that string literally. There is no need to escape it, Regexp.escape is already called internally.

Regexp.union(".")
#=> /\./

If you want to pass regular expressions to Regexp.union, don't use strings:

Regexp.union(Regexp.new("\\."))
#=> /\./


\\. is where you went wrong I think, if you want to match a . you should just use the first one \. Now you have a \ and \. and the first one is escaped.

To be safe just use the standard regex provided by Ruby which would be Regexp.new /\./ in your case

If you want to use union just use Regexp.union "." which should return /\./

From the ruby regex class:

Regexp.union("a+b*c")                #=> /a\+b\*c/
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号