2016-10-13 40 views
-1

這是我if條件:語法錯誤:意外tSTRING_BEG,長期待 ')' 如果條件

if (!href.value.include? "http://" || !href.value.include? "https://" || !href.value.include? "www" && href.value.include? ".htm") 

這是錯誤消息:

SyntaxError: unexpected tSTRING_BEG, expecting ')' 
... "www" && href.value.include? ".htm") 

然而,每個這樣的條件下獨立工作:

> hrefs.first.value 
=> "AccountantBocaRaton.html" 
> hrefs.first.value.include? "http://" 
=> false 
> hrefs.first.value.include? "https://" 
=> false 
> hrefs.first.value.include? "wwww" 
=> false 
> hrefs.first.value.include? ".html" 
=> true 
> hrefs.first.value.include? ".htm" 
=> true 

什麼可能導致這種情況?

編輯1

我也試圖分裂起來,把周圍的括號所有||條件和周圍的&&條件,我仍然得到同樣的錯誤。

回答

3

壞:

'asd'.include? 'a' && 'asd'.include 's' 

SyntaxError: (irb):2: syntax error, unexpected tSTRING_BEG, expecting end-of-input 
'asd'.include? 'a' && 'asd'.include? 's' 

好:

'asd'.include?('a') && 'asd'.include?('s') 

&&是混淆解析器。因爲這是一種含糊不清的理由。

之處在於:

!href.value.include?("www" && href.value.include?(".htm")) 

或者你可能是指:

!href.value.include?("www") && href.value.include?(".htm") 

所以添加一些括號,它應該沒問題。

+0

也可以用寬鬆'和'。 – tadman

3

亞歷克斯·韋恩答案將解決這個問題,並解釋了爲什麼SyntaxError被拋出,但更好的解決方案海事組織,而不是具有巨大的if聲明,使用正則表達式:

web_regex = /http:\/\/|https:\/\/|www|htm/ 
if !(href.value =~ web_regex) 
    #rest of code here 
end 

=~將返回0(truthy)或nil(falsey)。我確信在正則表達式路由上還有其他的一些調整,但是我上面的內容比簡單的if聲明簡潔易維護。

+2

當'/.../'語法與表達式中的斜槓相沖突時,可以使用'%r [...]'。這避免了很多醜陋的逃避。除非href.value.match(web_regex)''比Perl中常常神祕的'=〜'操作符更具可讀性。 – tadman

+0

每天學習新東西......謝謝! – aceofbassgreg

0

除了@Alex Wayne的回答。寫這個的一種方法就像下面(更容易看清楚)。

str = "https://wwww.AccountantBocaRaton.html" ; 
    if !(str.include?("http://") 
     || str.include?("https://") 
     || str.include?("www")) 
     && (str.include?(".htm")) 
     puts true 

    else 
     puts false 
    end 

    returns=> false 

*****正測試用例:*****通過IRB

str = "AccountantBocaRaton.html" 
    if !(str.include?("http://") 
     || str.include?("https://") 
     || str.include?("www")) 
     && (str.include?(".htm")) 
     puts true 

    else 
     puts false 
    end 

    returns=> true 

快速測試:

irb(main):024:0> str = "AccountantBocaRaton.html" ; if !(str.include?("http://") || str.include?("https://") || str.include?("www")) && (str.include?(".htm")); puts true ; else puts false ; end 
true 
+0

那些分號是什麼? – tadman

+0

將其作爲一個在線留言「剩菜」。現在將刪除它們。 – zee

+0

感謝@tadman的領導 – zee

相關問題