在Ruby中从string创build一个不区分大小写的正则expression式

比方说,我有一个任意的string

`A man + a plan * a canal : Panama!` 

我想做一个正则expression式search除了大小写以外的string。 也就是说,这个正则expression式应该匹配string

 `a man + A PLAN * a canal : PaNaMa!` 

我认为最好的方法是在Ruby正则expression式中以反斜杠转义每个具有特殊含义的字符,然后使用该string和Regexp::IGNORECASE作为参数执行Regexp.new 。 是对的吗? 有没有一个尝试和真正的正则expression式转换任意string到文字正则expression式?

顺便说一下,我最终希望使用这个正则expression式来执行任意的不区分大小写的MongoDB查询。 所以如果还有其他方法可以做,请让我知道。

您可以使用Regexp.escape来转义string中所有由正则expression式引擎处理的字符。

 Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), Regexp::IGNORECASE) 

要么

 Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), "i") 

Ruby正则expression式可以像string一样插入expression式,使用#{}表示法。 但是,您必须转义任何正则expression式特殊字符。 例如:

 input_str = "A man + a plan * a canal : Panama!" /#{Regexp.escape input_str}/i 

如果你知道正则expression式,你可以在expression式之后添加“i”(例如/the center cannot hold it is too late/i ),以使它不区分大小写 。

一个稍微更有语法含义的方法是使用Regexp文字的%r符号:

 input_str = "A man + a plan * a canal : Panama!" %r(#{Regexp.escape(input_str)})i 

当然这归结于个人偏好。