2012-11-30 73 views
-1

有人能告诉我为什么这个方法总是返回true,即使字符串不匹配模式?我已经通过TextWrangler的正则表达式引擎运行了正则表达式,并且该模式是正确的。谢谢Ruby的.match方法总是返回true

def validatePEM pem 
if /^-{4}([-\s])BEGIN/.match(pem) 
    print "validatePEM found a match\n" 
    return true 
else 
    return false 
    end 
end 
@s = '---BEGIN RSA PRIVATE KEY-----' 


if validatePEM @s 
    print "VALID PEM FILE\n" 
else 
    print "INVALID PEM FILE\n" 
end 
+1

我不能告诉你,但你的模式不符合你的想法。 '[...]'是一个字符类,匹配里面的任何字符。不需要额外的括号或管道:'/^[ - ] {4} [\ s-] BEGIN /'(注意,如果字符类是类中的最后一个字符,但这是一个口味问题) –

+0

感谢您指出逃脱的连字符 – Slinky

+0

他们不是问题。我现在意识到我并不清楚。这不是说括号和管道“不需要”。你不能包含它们。因为,如果你这样做,字符类也将匹配一个字面括号或一个文字管道。还有关于你的新正则表达式。它和我的一样,它只是非常多余的。 “{1}”绝不会改变任何内容(在任何情况下)。而'([ - ] | \ s)'与'[\ s-]'相同。还要注意'\ s'也匹配制表符和换行符。不仅仅是空间。 –

回答

1

就像一个FYI,有几件事情在“un-Ruby”的方式完成。

我会写:

def validatePEM pem 
if /\A-{4}([-\s])BEGIN/.match(pem) 
    print "validatePEM found a match\n" 
    return true 
else 
    return false 
    end 
end 
@s = '---BEGIN RSA PRIVATE KEY-----' 


if validatePEM @s 
    print "VALID PEM FILE\n" 
else 
    print "INVALID PEM FILE\n" 
end 

类似:

def validatePEM(pem) 
    !!pem[/\A-{4}([\s-])BEGIN/] 
end 

@s = '---BEGIN RSA PRIVATE KEY-----' 

puts '%s PEM FILE' % (validatePEM(@s) ? 'VALID' : 'INVALID') 

使用印刷三元声明的是什么,用Ruby编写的时候有人可能会怀疑,但Ruby Style guide同意写三元条件测试(?:)是好的。

+0

哇,这真的很不错,特别是方法的实现 – Slinky