我正在尝试从字符串对象构建正则表达式,该对象恰好存储在变量中。
我面临的问题是转义序列(在字符串中)如“\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/