【发布时间】:2012-11-19 00:23:50
【问题描述】:
有人能告诉我为什么这个方法总是返回 true,即使字符串与模式不匹配?我已经通过 TextWrangler 的正则表达式引擎运行了正则表达式,并且模式是正确的。谢谢
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
【问题讨论】:
-
我不能告诉你,但你的模式并不像你想象的那样。
[...]是一个字符类,匹配里面的任何字符。无需额外的括号或管道:/^[-]{4}[\s-]BEGIN/(请注意,如果字符类中的连字符是该类中的最后一个字符,则您没有必须转义它们 - 但这是个人喜好问题)跨度> -
感谢您指出转义的连字符
-
他们不是问题。我现在意识到我不是很清楚。并不是说“不需要”括号和管道。你不能包括他们。因为,如果这样做,字符类也将匹配文字括号或文字管道。关于你的新正则表达式。它和我的一样,只是高度冗余。
{1}永远不会改变任何东西(在任何情况下)。而([-]|\s)与[\s-]相同。另请注意,\s也匹配制表符和换行符。不仅是空格。 -
除了它是否有效之外,您应该使代码尽可能简单。
[-]应更改为-,{1}应删除,因为它什么都不做,(|)应更改为[]。正则表达式将是/^-{4}[-\s]BEGIN/。 -
确保问题的文本、示例代码和数据准确反映您的实际情况非常重要。请记住,您是在要求我们从一天中抽出时间来帮助您。
标签: ruby regex pattern-matching