2

このような正規表現があります。

/(?:http[s]?:\/\/)?(?:www\.)?(.*)/

プロトコルを無視して、Webサイトのドメイン部分をキャプチャしたいだけです。したがって、この正規表現は機能しますが、いくつかの空白もキャプチャします。ここの空きスペースはどこから来たのですか?これが分かれば、とても助かります。

一致するように次の文字列をフィードすると、

入力:

http://google.com
https://www.simplecms.com
www.facebook.com
gmail.com

出力:

Match 1
1.  google.com
Match 2
1.   
Match 3
1.  simplecms.com
Match 4
1.   
Match 5
1.  facebook.com
Match 6
1.   
Match 7
1.  gmail.com
Match 8
1.   
Match 9
1.    

出力を見ると、それは仕事をしていますが、空の文字列もキャプチャしています。このことをキャプチャするためのより良い方法があると確信しています。

4

5 に答える 5

2

正規表現の先頭と末尾に行頭/行末を追加してみてください。 ^最初$と最後で、行に一致します。あなたの正規表現がリターンを見て、それらを一致させていたと思います。

試してください:(^(?:http[s]?:\/\/)?(?:www\.)?(.*)$ 注:言語によってはエスケープする必要があるかもしれません)。

あなたが提供した例を使用して、ここで一致を表示する簡単なテストをセットアップしました。

于 2013-09-04T15:48:20.613 に答える
0

正規表現を使用する代わりに、組み込みのURI パーサーを使用します。

require 'uri'

def get_domain(url)
  url = 'http://' + url unless url =~ /^https?:\/\//i
  begin
    URI.parse(url).host
  rescue URI::InvalidURIError
    nil
  end
end

get_domain('http://google.com')         # => google.com
get_domain('https://www.simplecms.com') # => www.simplecms.com
get_domain('www.facebook.com')          # => www.facebook.com
get_domain('gmail.com')                 # => gmail.com
于 2013-09-04T20:51:16.040 に答える
0

この非正規表現アプローチを使用できます:-

require 'uri'

str = <<-eot
http://google.com
https://www.simplecms.com
www.facebook.com
gmail.com
eot

str.split.map{|u| uri=URI(u); uri.scheme ? uri.host : u}
# => ["google.com", "www.simplecms.com", "www.facebook.com", "gmail.com"]
于 2013-09-04T15:47:44.220 に答える