2016-08-08 186 views
2

所以我有一個問題,我的正則表達式如下所示:/true|false/紅寶石,真/假正則表達式

當我檢查這個詞falsee我得到真正的從這個表達式,是有辦法只是限制它的確切truefalse的話嗎?

回答

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

這還會匹配'truely'和'東西返回FALSE。 – GolfWolf

+0

@ w0lf編輯說明。 –

+0

感謝您的信息! – AlCode

3

您需要使用^$錨:

/^(true|false)$/ 

編輯:作爲卡里的評論中指出,該模式上面也會匹配碰巧包含一行truefalse的多行字符串。爲了避免這種情況,使用分別匹配字符串的開頭和結尾的\A\z分隔符:

/\A(true|false)\z/ 
+1

對於由單一行組成的字符串,您可以使用行尾錨('^'和'$')或字符串尾錨('\ A'和'\ z') 。我建議你在錨定字符串的末尾時使用後者。通過在這裏使用'^'和'$',你會延續許多Rubiest的錯誤信念,認爲它們是串尾錨。 –

+0

工程就像一個魅力!謝謝! – AlCode

+0

@CarySwoveland謝謝!我已經更新了我的答案。 – GolfWolf

2

試用

/^(true|false)$/ 

其中^是一條線,$結束的開始。

2

您可以使用

/^(true|false)$/ 

甚至更​​好

/\A(true|false)\z/ 

,將匹配字符串(而不是線)的起點和終點。如果你只需要匹配他的話,它可能是更有效地使用一個簡單的數組和include?

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