我在Ruby文件加载程序中有这一行:
row_hash.map{|k,v| v.gsub!(/\A"|"\Z/, '').try(:strip!) if !v.nil? }
我记得加上它,虽然原因让我感到安慰。我知道\A
和\Z
分别是字符串的开头和结尾。
我间歇性地写了15年的正则表达式,但是"|"
真的让我感到神秘吗?
答案 0 :(得分:1)
它从字符串中删除引号。
这个正则表达式患有倾斜的牙签综合征。我们可以通过使用0
,平衡分隔符和扩展格式来忽略空格。
%r
它匹配字符串开头的引号,或者结尾处的引号(或刚好在换行符之前)。
所以一起看......
%r{ \A" | "\Z }x;
v.gsub!( %r{ \A" | "\Z }x;, '' ).try(:strip) if !v.nil?
将应用匹配,直到它不再匹配为止。因此,它会匹配gsub!
开头和结尾的引号,并将其替换为空,全部替换为v
。最终结果是v
被删除了开头和结尾的引号。
然后是blah.try(:strip)
。这是一个Rails扩展,大致相当于......
v
如果匹配失败,blah.strip if blah
将返回null,这意味着只有当它在引号中时才会删除gsub!
。在引号被剥离后它将 它只会在有引号的情况下执行此操作。我怀疑这不是预期的行为。
但是,v
不会改变strip
,因此除非您使用v
的返回值,否则可能无效,这会使这更加复杂。您可能需要map
。
最后try(:strip!)
表示只有在if !v.nil?
不为零时才会发生这一切。把它放在已经很复杂的陈述的末尾会让事情变得更难理解。
这一行有点过于复杂。如果零检查是分开完成并且整个事情适当地间隔开来会更好。我还决定使用if条件而不是v
使得更明显只有在try
匹配时才会发生剥离,我不认为这是理想的行为并希望它真的对任何阅读它的人都很明显。
gsub
最后,由于行为非常具体和挑剔(并且可能是巧妙的错误),因此应将内部部分转换为方法,以便对其进行命名,记录和测试。
row_hash.map { |_,v|
next if v.nil?
if v.gsub!( %r{ \A" | "\Z }x;, '' )
v.strip!
end
}
答案 1 :(得分:1)
它替换字符串开头和结尾的引号字符。它忽略了角色的其他事件。以下是正则表达式的工作原理示例。
“|”并不意味着管道被引用。它基本匹配 \ A“(字符串的开头,然后是”)或 “\ Z (“后跟字符串结尾)
如果有帮助,请告诉我。