2017-08-14 9 views
0

URLのドメインと一致するようにJava正規表現を使用したいとします。たとえば、www.table.google.comの場合は 、私はURLから「google」を取得したいと思いますすなわち、このURL文字列の2番目の最後の単語。URLのドメインと一致するJava Regexp

何か助けていただければ幸いです!それは内部のドット\\.で何かを取り出し

.+\\.(.+)\\..+ 

:それは本当にあなたの入力の複雑さに依存

+0

「google.co.nz」、「google.com.au」、「goo.gl」についてはどうでしょうか? – Isaac

+0

'second last word'から文字列を取得する必要があることを既に知っているなら、' String'のutils関数を使って取得することができます。 'lastIndexOf("。 ")'を使用してpartを削除します。com 'これでもう一度' google'の部分を取得します –

+0

これは入力の複雑さによります...ここではかなり単純な正規表現です: '。+ \\。(。+)\\ .. +'、ここにそのパターンのいくつかの例:https://regex101.com/r/L52oz6/1。しかし、なぜホイールを再発明するか、複雑なURLを正しく解析する本当に良いライブラリがたくさんあります。しかし、確かに、簡単な入力のために小さな正規表現は簡単に構築されます。 – Zabuza

答えて

1

...ここ

は非常に単純正規表現です。

そのパターンの例を次に示します:https://regex101.com/r/L52oz6/1。 ご覧のとおり、単純な入力では機能しますが、複雑なURLでは機能しません。

しかし、なぜホイールを再発明すると、複雑なURLを正しく解析するライブラリがたくさんあります。しかし、確かに、簡単な入力のために小さな正規表現は簡単に構築されます。だからあなたの入力の問題を解決していない場合は、コールバックをして、私は正規表現のパターンを調整します。


あなたも同じように、単純な分割を使用することができます注:

String[] elements = input.split("\\."); 
String secondToLastElement = elements[elements.length - 2]; 

しかし、インデックスバウンドチェックを忘れないでください。


または、最後の位置から入力を歩くよりもすばやい解決方法を検索した場合。 最初のドットが見つかるまで続け、の2番目のドットが見つかるまで続けます。その後、その部分をinput.substring(index1, index2);で抽出します。

正確にその目的のためのデリゲートメソッド、つまりString#lastIndexOfdocumentationを参照)も既にあります。

String input = ... 
int indexLastDot = input.lastIndexOf('.'); 
int indexSecondToLastDot = input.lastIndexOf('.', indexLastDot); 
String secondToLastWord = input.substring(indexLastDot, indexSecondToLastDot); 

はたぶん境界は、1でオフになっていたコードをテストしていませんが、あなたのアイデアを得る:

は、このコードスニペットを見てみましょう。また、拘束チェックも忘れないでください。

このアプローチの利点は、実際には高速で、コピーを作成せずにStringの内部構造を直接操作できることです。

0
private static final Pattern URL_MATCH_GET_SECOND_AND_LAST = 
     Pattern.compile("www.(.*)//.google.(.*)", Pattern.CASE_INSENSITIVE); 

String sURL = "www.table.google.com"; 

if (URL_MATCH_GET_SECOND_AND_LAST.matcher(sURL).find()){ 

    Matcher matchURL = URL_MATCH_GET_SECOND_AND_LAST .matcher(sURL); 

    if (matchURL .find()) { 
     String sFirst = matchURL.group(1); 
     String sSecond= matchURL.group(2); 
    } 
} 
1

私の試み:

(?<scheme>https?:\/\/)?(?<subdomain>\S*?)(?<domainword>[^.\s]+)(?<tld>\.[a-z]+|\.[a-z]{2,3}\.[a-z]{2,3})(?=\/|$) 

Demo。正しく動作する:

http://www.foo.stackoverflow.com 
http://www.stackoverflow.com 
http://www.stackoverflow.com/ 
http://stackoverflow.com 
https://www.stackoverflow.com 
www.stackoverflow.com 
stackoverflow.com 
http://www.stackoverflow.com 
http://www.stackoverflow.co.uk 
foo.www.stackoverflow.com 
foo.www.stackoverflow.co.uk 
foo.www.stackoverflow.co.uk/a/b/c 
関連する問題