我使用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的输出是错误的。但实际结果是正确的。它过滤了正确的语言。我不一定了解这里发生了什么,但它有效吗?!
答案 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
吗?
p
和puts
之间也存在差异:
▶ p "\\."
# ⇒ "\\."
▶ puts "\\."
# ⇒ \.