这是我的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
我也尝试将其拆分,将问题放在所有||
条件和&&
条件周围,我仍然会遇到同样的错误。
答案 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