【问题标题】:Ruby's .match method always returning trueRuby 的 .match 方法总是返回 true
【发布时间】: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


【解决方案1】:

仅供参考,有几件事以“非 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 同意使用三元 (?:) 编写简单的条件测试是可以的。

【讨论】:

  • 哇,真不错,尤其是方法实现
猜你喜欢
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2012-05-15
  • 2012-02-21
  • 2012-09-08
  • 1970-01-01
  • 2013-08-06
相关资源
最近更新 更多