所以我的问题出现在我的正则表达式中:/true|false/
。
当我检查单词falsee
时,我从这个正则表达式中得到了一个真的,有没有办法将其限制为确切的true
或false
字?
答案 0 :(得分:4)
使用此正则表达式:
/^(true|false)$/
它将分别与^
和$
匹配测试字符串的开头和结尾,因此字符串中没有其他内容(完全匹配)。
请参阅Regex101的实时示例。
UPDATE (请参阅@ w0lf的评论):括号是隔离true|false
子句,以便它们不会被错误地分组。 (这也会将true
或false
匹配放在第一个捕获组中,但由于您似乎只匹配而不捕获输出,因此这不会产生影响。
或者,如果您只想匹配两个值,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在评论中指出的那样,上面的模式也会匹配碰巧包含true
或false
行的多行字符串。要避免这种情况,请分别使用与字符串开头和结尾匹配的\A
和\z
分隔符:
/\A(true|false)\z/
答案 2 :(得分:2)
试试
/^(true|false)$/
其中^是一行的开头,$是结尾。
答案 3 :(得分:2)
您可以使用
/^(true|false)$/
甚至更好
/\A(true|false)\z/
将匹配字符串的开头和结尾(而不是行)。如果您只需匹配其单词,则使用简单数组include?
可能更有效:
%w( true false ).include?(value)