2012-01-05 44 views
2

找到确切的话我有链接到我的性别使用关键字分类服装网站的列表。根据它们是什么网站,他们都有不同的URL结构,例如...在一个字符串

www.website1.com/shop/womens/tops/tshirt

www.website2.com/products/womens-tshirt

我不能使用.include?方法,因为无论它是.include?(“mens”)还是.include?(“womens”),它都会返回true。我怎么能有一个方法,只会返回“女性”(反之亦然)。我怀疑它可能必须是某种正则表达式,但我对这些并不熟悉,而且不同的URL结构使它更加棘手。任何帮助非常感谢,谢谢!

回答

16

这样做的规范正则表达式的方法是在字边界搜索:

pry(main)> "foo/womens/bar".match(/\bwomens\b/) 
=> #<MatchData "womens"> 
pry(main)> "foo/womens/bar".match(/\bmens\b/) 
=> nil 
pry(main)> "foo/mens/bar".match(/\bmens\b/) 
=> #<MatchData "mens"> 
pry(main)> "foo/mens/bar".match(/\bwomens\b/) 
=> nil 

这就是说,无论是拆分,或搜索领先"/",可能是足够的。

+0

对于记录来说,单词字符不包括诸如破折号或下划线之类的东西,因此这些都被视为字边界,所以如果你的字符串中有这些方法不会正确工作。 – Ibrahim 2016-07-29 00:58:28

1

您可以用/分裂,并检查您需要的组件(一个或多个)上的字符串相等 - 无需使用正则表达式有

11

如果您women首先检查它应该工作:

# assumes str is not nil 
def gender(str) 
    if str.include?("women") 
    "F" 
    elsif str.include?("men") 
    "M" 
    else 
    nil 
    end 
end 

如果这不是你正在寻找的,请更详细地解释你的问题。

+0

这是这样做的,我没有想到的一个聪明的办法。我使用Dave Newtons方法,因为它更简洁,但是我给了你特别表扬的赞扬。 – tob88 2012-01-05 18:10:42

0
keyword = "women" 
url = "www.website1.com/shop/womens/tops/tshirt" 
/\/#{keyword}/ =~ url 
=> 21 
keyword = "men" 
url = "www.website1.com/shop/womens/tops/tshirt" 
/\/#{keyword}/ =~ url 
=> nil 
keyword = "women" 
url = www.website2.com/products/womens-tshirt 
/\/#{keyword}/ =~ url 
=> 25 
keyword = "men" 
url = www.website2.com/products/womens-tshirt 
/\/#{keyword}/ =~ url 
=> nil 

然后,只需做一个!!它:

=> !!nil => false 
=> !!25 => true 
+0

真的需要双重否定吗?我在静态类型语言中使用它,只是想知道这里的参数是什么? – 2012-01-05 16:52:54

+0

双重负片可将所有内容变为真或假。所以无论是假还是假,其他事情都变成了现实。 OP要求返回一个布尔值 – Yule 2012-01-05 16:59:48

+0

我知道双重否定是如何工作的。 OP没有陈述对布尔类型的严格要求,而在Ruby中,不是'nil'或'false'的所有东西都是'true'。我只是想知道是否有任何其他使用它的论点。 – 2012-01-05 17:06:08