2012-01-05 23 views
2

私は、衣服のウェブサイトへのリンクのリストを持っていますが、キーワードを使用して性別で分類しています。彼らが何であるか、ウェブサイトによっては、それらはすべて文字列内の正確な単語を検索する

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

www.website2.com/products ...例えば、異なるURL構造を持っています/ womens-tshirt

私は.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

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

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

二重否定は本当に必要ですか?私は静的型付けされた言語でそれを使用しています。 –

+0

ダブルネガは、すべてを真または偽に変えます。 nilまたはfalseがfalseになると、他のすべてがtrueになります。 OPはブール値が返されることが必要です – Yule

+0

二重否定がどのように機能するか知っています。 OPはブール型の厳密な要件を述べておらず、Rubyでは 'nil'でも' false'でもないものはすべて 'true'です。私はそれを使用するための他の議論があるかどうか疑問に思っていただけです。 –