2016-08-01 7 views
2

私は以下のプログラムでフレーム化された問題があります。a =、symbol =、uid =、cidの後ろにある値のようなURL文字列から値を抽出しようとしています=、o =。URLを処理エラーで解析して必要な値を抽出する最も効率的な方法

プログラムで宣言された配列に表示されているサンプルURLに対して、これらの値を抽出する最適な方法は何ですか?

私は、プログラムの出力ステートメントに示されている解析時間を最小限に抑えたがっています。

package com.xyz.urlagent; 

import java.util.Date; 
import java.util.Random; 

public class UrlExtract { 

public static String[] urlArray = {"https://example.com/grid/p/login?cid=testcidcombo4&uid=testuidcombo4&a=testadcodecombo4&o=testoffercodecombo4", 
        "https://example.com/grid/p/site#r=jPage/https://research-example.com/grid/wwws/research/stocks/earnings?c_name=hvfkhfk_VENDOR&symbol=IBM", 
        "https://example.com/grid/p/login?a=testadcode3", 
        "https://example.com/grid/p/site#r=jPage/https://research-example.com/grid/wwws/fixedIncome/bondTicker.asp?c_name=_jhcjhfhyjkh_VENDOR&Extra=", 
        "https://example.com/grid/p/site#r=jPage/https://example.com/grid/wwws/ideas/overview/overview.asp?YYY600_4TasO+9+jFhYnkq2U5YXohiZ9qsMKu/jUh6HR8N5EWKAOlRWVhC18/dapBTvnqGaqgNGUMvWP3EfysyWRfCNYsqUFBc1pxuB8/ho+4G2BBo=&c_name=khhfjkuk_VENDOR", 
        "https://example.com/grid/p/site#r=jPage/https://research-example.com/grid/wwws/research/stocks/earnings?symbol=AAPL&c_name=jkvkjgljlj_VENDOR", 
        "https://example.com/grid/p/login?CID=testcid1"}; 
public static int numurl = 2000; 
public static Random rand = new Random(System.currentTimeMillis()); 

public static void main(String[] args) { 
    Date StartDate= new Date(); 
    for(int i=0; i<numurl;i++){  
      String SampleURL = urlArray[rand.nextInt(urlArray.length)]; 

      ////////////############ CODE To Extract symbol Values from URL(value after symbol=) 

      ////////////############ CODE To Extract UID Values from URL(value after uid=) 

      ////////////############ CODE To Extract CID Values from URL(value after cid=) 

      ////////////############ CODE To Extract O Values from URL(value after o=) 

      ////////////############ CODE To Extract A Values from URL(value after a=) 

      System.out.println("Values extracted from Sample URL: "+ "(Extracted Values are printed HERE)");     
     } 
    Date EndDate= new Date(); 
    long diff = (EndDate.getTime()-StartDate.getTime())/(1000%60); 
    System.out.println("Time taken to parse "+numurl+ " url's is: "+diff+ " seconds."); 
    } 

} 
+2

率直に言えば、ここでは効率以上の正しさが好きです。 URLパラメータのすべてのエンコード規則では、これは正しく行うために重要ではありません。良いライブラリを使用してください。 – Henry

+0

ここで見ることができます:http://stackoverflow.com/a/31600846/1475228 –

+0

おかげでHenryは一番大事ですが、私は毎秒大量のデータでこれをやっていますので、できるだけ早い解決策も探しています。 – RAJESH

答えて

0

URIクラスとURLDecoderクラスは、あなたがやりたいように設計されています

URI uri = URI.create(sampleURL); 
String query = uri.getRawQuery(); 
String[] nameValuePairs = query.split("&"); 
for (String nameValuePair : nameValuePairs) { 
    String nameAndValue = nameValuePair.split("=", 2); 
    String name = URLDecoder.decode(nameAndValue[0], "UTF-8"); 
    String value = URLDecoder.decode(nameAndValue[1], "UTF-8"); 

    System.out.printf("Found query parameter \"%s\" with value \"%s\"%n", 
     name, value); 
} 

#rは、クエリの前に来るのであなたの例の文字列のいくつかは、まったく有効なURLではないことに注意してくださいセパレータ、?。 URIの構造は、URIクラスのドキュメントと、URIの構造を定義するRFCのRFC 3986に記載されています。

関連する問題