从Ruby中的字符串创建不区分大小写的正则表达式

Tre*_*ham 46 ruby regex

假设我有一个任意的字符串

`A man + a plan * a canal : Panama!`
Run Code Online (Sandbox Code Playgroud)

我想做一个正则表达式搜索除了case之外的其他字符串.也就是说,这个正则表达式应该与字符串匹配

`a man + A PLAN * a canal : PaNaMa!`
Run Code Online (Sandbox Code Playgroud)

我认为最好的方法是反斜杠 - 在Ruby正则表达式中具有特殊含义的每个字符,然后Regexp.new使用该字符串和Regexp::IGNORECASE参数.是对的吗?是否有一个经过验证的正则表达式,用于将任意字符串转换为文字正则表达式?

顺便说一句,我最终想要使用这个正则表达式来执行任意不区分大小写的MongoDB查询.所以,如果我有另一种方式,请告诉我.

sep*_*p2k 52

您可以使用它Regexp.escape来转义字符串中的所有字符,否则这些字符将由regexp引擎专门处理.

Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), Regexp::IGNORECASE)
Run Code Online (Sandbox Code Playgroud)

要么

Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), "i")
Run Code Online (Sandbox Code Playgroud)


Dav*_*sch 48

Ruby正则表达式可以使用#{}符号以与字符串相同的方式插入表达式.但是,您必须转义任何正则表达式特殊字符.例如:

input_str = "A man + a plan * a canal : Panama!"
/#{Regexp.escape input_str}/i
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常好的答案 - 它比顶级投票响应更好,并且感觉更像是Ruby来引导我.希望其他人也会赞成这一点. (3认同)

And*_*imm 27

如果您已经知道了所需的正则表达式,则可以在表达式(例如/the center cannot hold it is too late/i)之后添加"i" 以使其不区分大小写.

  • 是的,但这不是我问的问题.我有一个任意字符串(来自用户输入),而不是正则表达式.例如,如果用户输入"a + b",我希望能够找到"A + b","a + B"或"A + B",而不是"aaaaab". (3认同)

rus*_*sty 7

一个稍微更复杂的语法方法是使用%rRegexp文字的表示法:

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

当然,这取决于个人喜好.