Ruby,真/假正则表达式

时间:2016-08-08 15:21:49

标签: ruby regex

所以我的问题出现在我的正则表达式中:/true|false/

当我检查单词falsee时,我从这个正则表达式中得到了一个真的,有没有办法将其限制为确切的truefalse字?

4 个答案:

答案 0 :(得分:4)

使用此正则表达式:

/^(true|false)$/

它将分别与^$匹配测试字符串的开头和结尾,因此字符串中没有其他内容(完全匹配)。

请参阅Regex101的实时示例。

UPDATE (请参阅@ w0lf的评论):括号是隔离true|false子句,以便它们不会被错误地分组。 (这也会将truefalse匹配放在第一个捕获组中,但由于您似乎只匹配而不捕获输出,因此这不会产生影响。

或者,如果您只想匹配两个值,Ruby中有更简单的方法。 @SimoneCarletti建议一个。您还可以使用基本的==eql?运算符。尝试运行以下脚本以查看这些都可以正常工作:

values = ["true", "false", "almosttrue", "falsealmost"]
values.each do | value |
  puts value

  # these three are all equivalent
  puts "match with if" if value == "true" || value == "false"
  puts "match with equals?" if (value.eql? "true") || (value.eql? "false")
  puts "match with regex" if /^(true|false)$/.match value

  puts
end

答案 1 :(得分:3)

您需要使用^$锚:

/^(true|false)$/

修改:正如Cary在评论中指出的那样,上面的模式也会匹配碰巧包含truefalse行的多行字符串。要避免这种情况,请分别使用与字符串开头和结尾匹配的\A\z分隔符:

/\A(true|false)\z/

答案 2 :(得分:2)

试试

/^(true|false)$/

其中^是一行的开头,$是结尾。

答案 3 :(得分:2)

您可以使用

/^(true|false)$/

甚至更好

/\A(true|false)\z/

将匹配字符串的开头和结尾(而不是行)。如果您只需匹配其单词,则使用简单数组include?可能更有效:

%w( true false ).include?(value)