这个正则表达式取代了什么?

时间:2016-06-03 18:05:40

标签: ruby regex

我在Ruby文件加载程序中有这一行:

row_hash.map{|k,v| v.gsub!(/\A"|"\Z/, '').try(:strip!) if !v.nil? }

我记得加上它,虽然原因让我感到安慰。我知道\A\Z分别是字符串的开头和结尾。

我间歇性地写了15年的正则表达式,但是"|"真的让我感到神秘吗?

2 个答案:

答案 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)

它替换字符串开头和结尾的引号字符。它忽略了角色的其他事件。以下是正则表达式的工作原理示例。

  

http://rubular.com/r/pVMbQ9aqSl

“|”并不意味着管道被引用。它基本匹配 \ A“(字符串的开头,然后是 “\ Z 后跟字符串结尾)

如果有帮助,请告诉我。