Ruby Regexp:单个正则表达式与new和union之间的区别

时间:2011-10-16 13:55:20

标签: ruby regex

我简化了这些例子。假设我有一个包含正则表达式代码的字符串。我希望正则表达式匹配一个文字点,因此我希望它是:

\.

所以我创建了以下Ruby字符串:

"\\."

然而,当我与Regexp.union一起使用它来创建我的正则表达式时,我明白了:

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

这将匹配斜线后跟一个点,而不只是一个点。将之前的结果与此进行比较:

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

给出了我想要的Regexp但没有所需的联合。

你能解释一下为什么Ruby会这样做以及如何正确结合正则表达式吗?利用的上下文是导入描述正则表达式的JSON字符串并在Ruby中将它们联合起来。

2 个答案:

答案 0 :(得分:5)

将字符串传递给Regexp.union旨在按字面意思匹配该字符串。没有必要逃避它,Regexp.escape已在内部调用。

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

如果要将正则表达式传递给Regexp.union,请不要使用字符串:

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

答案 1 :(得分:0)

\\.是您出错的地方我认为,如果您想匹配.,您应该使用第一个\.现在您有\和{ {1}}并且第一个被转义。

为了安全,只需使用Ruby提供的标准正则表达式,在你的情况下为\.

如果你想使用联盟,只需使用Regexp.new /\./,它应返回Regexp.union "."

来自ruby regex类:

/\./