ruby - 从存储在带有转义字符的变量中的字符串创建正则表达式 (Ruby)

标签 ruby regex string double-quotes

我正在尝试从字符串对象构建正则表达式,该对象恰好存储在变量中。

我面临的问题是转义序列(在字符串中)如“\d”不会产生结果正则表达式。

Regexp.new("\d") => /d/

如果我使用单引号,强硬,它会完美地工作。

Regexp.new('\d') => /\d/

但是,由于我的字符串存储在变量中,因此我总是得到双引号字符串。

有没有办法将双引号字符串转换为单引号字符串,以便我可以在 Regexp 构造函数中使用?

(我想使用双引号的字符串插值功能)

例如:

email_pattern = "/[a-z]*\.com"
whole_pattern = "to: #{email_pattern}"
Regexp.new(whole_pattern)

为了更好的可读性,我想避免转义转义字符。

"\\d"

最佳答案

问题是,您最终会得到完全不同的字符串,具体取决于您使用单引号还是双引号:

"\d".chars.to_a
#=> ["d"]

'\d'.chars.to_a
#=> ["\\", "d"]

因此,当您使用双引号时,单引号 \根据定义立即丢失且无法恢复,例如:

"\d" == "d"
#=> true

所以你永远无法知道转义发生之前字符串包含什么。正如 @FrankSchmitt 建议的那样,使用双反斜杠或坚持使用单引号。没有别的办法了。

不过,还有一个选择。您可以将正则表达式部分定义为正则表达式本身,而不是字符串。它们的行为完全符合预期:

regex1 = /\d/
#=> /\d/

regex2 = /foobar/
#=> /foobar/

然后,您可以使用 #{} 构建最终的正则表达式-风格插值,而不是从字符串构建正则表达式源:

regex3 = /#{regex1} #{regex2}/
#=> /(?-mix:\d) (?-mix:foobar)/

反射(reflect)您的示例,这将转换为:

email_regex = /[a-z]*\.com/
whole_regex = /to: #{email_regex}/
#=> /to: (?-mix:[a-z]*\.com)/

您还可以找到Regexp#escape有趣的。 (see the docs)

如果您遇到进一步的转义问题(使用斜杠),您还可以使用替代的正则表达式文字语法 %r{<your regex here>} ,其中您不需要转义 /特点。例如:

%r{/}
#=> /\//

无法逃避反斜杠 \\\不过。

关于ruby - 从存储在带有转义字符的变量中的字符串创建正则表达式 (Ruby),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13252743/

相关文章:

ruby - Ruby 1.9.3 中 here 文档的语法是否不同?

java - 从多次出现的较大字符串中获取特定的小字符串

java - 使用 Java Scanner 从控制台读取很长的字符串需要时间吗?

欧元符号 (€) 的正则表达式

通过动态分配内存更改字符指针中的字符

ruby-on-rails - 如果您在某个页面上,则隐藏按钮

ruby-on-rails - 测试 ActiveRecord::RecordNotFound

ruby - Ruby 中的正则表达式帮助

python - 当正则表达式匹配做某事时

javascript - 使用 jQuery 查找子字符串