【问题标题】:Convert a string to regular expression ruby将字符串转换为正则表达式 ruby
【发布时间】:2012-01-28 23:27:34
【问题描述】:

我需要将“/[\w\s]+/”之类的字符串转换为正则表达式。

"/[\w\s]+/" => /[\w\s]+/

我尝试使用不同的Regexp 方法,例如:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//,类似Regexp.compileRegexp.escape。但它们都没有像我预期的那样返回。

我还尝试删除反斜杠:

Regexp.new("[\w\s]+") => /[w ]+/ 但运气不好。

然后我试着做的很简单:

str = "[\w\s]+"
=> "[w ]+"

它逃脱了。现在字符串如何保持原样并转换为正则表达式对象?

【问题讨论】:

    标签: ruby regex string ruby-1.9.3


    【解决方案1】:

    说清楚

      /#{Regexp.quote(your_string_variable)}/
    

    也在工作

    edit: 将 your_string_variable 包装在 Regexp.quote 中,以确保正确性。

    【讨论】:

    • 刚刚发现您不能以这种方式附加选项,例如/#{your_regex}/#{options}
    • 这不符合 OP 在 Ruby 2.1 上的要求,它转换了 "[\w\s]+" => /[w ]+/
    • 请注意,答案是在 2012 年给出的 :) 那时一切都很完美
    • 这是完美的一年。
    • 结合答案可以避免字符串插值:Regexp.new(Regexp.quote(your_string_variable))
    【解决方案2】:

    此方法将安全地转义所有具有特殊含义的字符:

    /#{Regexp.quote(your_string)}/
    

    例如,. 将被转义,因为它会被解释为“任何字符”。

    请记住使用单引号字符串,除非您希望使用常规字符串插值,其中反斜杠具有特殊含义。

    【讨论】:

    • 很好,因为它解释了我们如何保护可能包含将在正则表达式中解释的符号(例如+.)的字符串变量。
    • 这不符合 OP 在 Ruby 2.1 上的要求,它转换了 "[\w\s]+" => /[w\ ]\+/
    • @LucaSpiller 您需要使用单引号字符串,反斜杠在双引号字符串中被视为特殊字符,这就是为什么例如"\n" 是换行符,但 '\n' 不是。
    【解决方案3】:

    使用 % 表示法:

    %r{\w+}m => /\w+/m
    

    regex_string = '\W+'
    %r[#{regex_string}]
    

    来自help

    %r[ ] 插值正则表达式(标志可以在关闭后出现 分隔符)

    【讨论】:

    • 这不符合 OP 在 Ruby 2.1 上的要求,它转换了 "[\w\s]+" => /[ws]+/
    • @Luca Spiller,谢谢,这里应该使用单引号,我会更新答案。
    【解决方案4】:

    gem to_regexp 可以完成这项工作。

    "/[\w\s]+/".to_regexp => /[\w\s]+/
    

    你也可以使用修饰符:

    '/foo/i'.to_regexp => /foo/i
    

    最后,使用 :detect 可以让你更懒惰

    'foo'.to_regexp(detect: true)     #=> /foo/
    'foo\b'.to_regexp(detect: true)   #=> %r{foo\\b}
    '/foo\b/'.to_regexp(detect: true) #=> %r{foo\b}
    'foo\b/'.to_regexp(detect: true)  #=> %r{foo\\b/}
    

    【讨论】:

      【解决方案5】:

      看起来你需要将初始字符串放在单引号中(参考this page

      >> str = '[\w\s]+'
       => "[\\w\\s]+" 
      >> Regexp.new str
       => /[\w\s]+/ 
      

      【讨论】:

        猜你喜欢
        • 2016-08-13
        • 1970-01-01
        • 2021-10-02
        • 2011-10-03
        • 2022-11-18
        • 2013-06-09
        • 2015-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多