Ruby 2.1.2的Regexp.new在控制台和Rails服务器中运行时表现不同

时间:2014-11-07 10:26:05

标签: ruby regex

我使用Ruby 2.1.2p95(2014-05-08修订版45877)和Rails 4.1.7

我想检查.en..de.的这种字符串:
8a118a8a485481d401493d0ae7ad7fba.en.3
8a11y48sf85481d401493d0ae7a37fba.de.1

我需要将en / de部分作为字符串替换:"#{@language}"

我在rails控制台中使用此Regex:

Regexp.new("\\.#{@language}\\.") # @language = 'en'
# => /\.en\./

这就是我想要的。这是对的。

在我班上我使用这种方法:

def entry_is_of_language?(guid)
  lang_regexp = Regexp.new("\\.#{@language}\\.")
  guid.scan(lang_regexp).any?
end

# => /\\.en\\./

为什么我班级中的方法会逃避反斜杠,但控制台不会这样做?任何的想法?

修改
要回答@ mudasobwa的评论,这是@language的输出:

def entry_is_of_language?(guid)
  lang_regexp = Regexp.new("\\.#{@language}\\.")
  p "-- #{@language} -- #{lang_regexp} --"
  guid.scan(lang_regexp).any?
end

# => "-- de -- (?-mix:\\.de\\.) --"

但这是奇怪的部分:它有效。
在我看来,在服务器日志中写入时,Regexp的输出是错误的。但实际结果是正确的。它过滤了正确的语言。我不一定了解这里发生了什么,但它有效吗?!

1 个答案:

答案 0 :(得分:1)

我很确定问题是@language变量未正确定义。以下是我2.1.2-95框中的测试:

guid='8a118a8a485481d401493d0ae7ad7fba.en.3'

class B
   attr_reader :language
   def initialize
     @language = 'en'
   end 
   def entry_is_of_language?(guid)
     lang_regexp = Regexp.new("\\.#{@language}\\.")
     puts "Using #{lang_regexp}"
     guid.scan(lang_regexp).any?
   end 
end
B.new.entry_is_of_language? guid

# ⇒ Using (?-mix:\.en\.)
# ⇒ true

你介意puts @language吗?

pputs之间也存在差异:

▶ p "\\."
# ⇒ "\\."
▶ puts "\\."
# ⇒ \.