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

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

\. 

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

 "\\." 

但是,当我与Regexp.union一起使用它来创建我的正则表达式时,我得到了这个:

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

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

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

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

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

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

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

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

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

\\. 是你出错的地方我认为,如果你想匹配一个. 你应该只使用第一个\. 现在你有一个\\. 而第一个是逃脱的。

为了安全起见,只需使用Ruby提供的标准正则表达式,在你的情况下就是Regexp.new /\./

如果你想使用union,只需使用Regexp.union "." 哪个应该返回/\./

从ruby正则表达式类:

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