SyntaxError:意外的tSTRING_BEG,期待')'在长期如果条件

时间:2016-10-13 00:58:24

标签: ruby

这是我的if条件:

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 个答案:

答案 0 :(得分: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")

所以添加一些parens,它应该没问题。

答案 1 :(得分:3)

Alex Wayne的回答将解决问题,并解释为什么抛出SyntaxError,但更好的解决方案IMO使用正则表达式而不是使用巨型if语句:< / p>

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

=~将返回0(真实)或nil(falsey)。我确信在正则表达式路线上还有其他调整,但我上面的内容比简单的if语句更简洁,更易于维护。

答案 2 :(得分: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

*****正面测试案例:*****

   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进行快速测试:

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