2017-09-11 8 views
0

大きな文字列から値を抽出する最も効率的な方法を見つけようとしています。Javascriptを使用したStringからの値の解析

EXT-X-DATERANGE:ID="PreRoll_Ident_Open",START-DATE="2016-12-14T120000.000z",DURATION=3,X-PlayHeadStart="0.000",X-AdID="AA-1QPN49M9H2112",X-TRANSACTION-VPRN-ID="1486060788",X-TrackingDefault="1",X-TrackingDefaultURI="http,//606ca.v.fwmrm.net/ad/l/1?s=g015&n=394953%3B394953&t=1485791181366184015&f=&r=394953&adid=15914070&reid=5469372&arid=0&auid=&cn=defaultImpression&et=i&_cc=15914070,5469372,,,1485791181,1&tpos=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr="s=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr=" 

これは例として挙げたものです。 アイデアは、すべての大文字の文字列を前に抽出することです:オブジェクトのキーとして、そしてその値として次のカンマまで引用符の間にあるすべてのもの。次に、このオブジェクトが作成されるまで文字列全体を反復処理します。

nonParsed.substring(nonParsed.lastIndexOf("="")+1, nonParsed.lastIndexOf("",")); 

私はスタートとして、この概念を持っていたが、いくつかの助けこれを反復し、それをより効率的に高く評価されるだろう。あなたは、ヘッダーのためのケースの文字列だけでなく、大文字を混ぜているように見えます

{ 
    'EXT-X-DATERANGE:ID': 'PreRoll_Ident_Open', 
    'START-DATE': '2016-12-14T120000.000z', 
    'DURATION': '3', 
    ... 
} 
+0

おそらくこれは役に立ちます:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions –

+1

あなたのXにカンマがあるようですから普通より少し難しいでしょう-TrackingDefaultURIコロンがあるはずのヘッダー値。これは、素朴な分割をより困難にします。 –

+0

最終出力は何ですか? – revo

答えて

2

予測可能なパターンを台無しに唯一のプロパティは、番号が続いているDURATION、あるように見えます。それ以外の場合は、="",の交互パターンに依存することができます。

あなたは次に

str = str.replace(/DURATION=(\d+)/, `DURATION="$1"`); 
return str.split('",').reduce((acc, entry) => { 
    let key = `'${entry.split('="')[0]}'`; 
    let value = `'${entry.split('="')[1]}'`; 
    acc[key] = value; 
    return acc; 
}, {}); 

ような何かをあなたに必要に応じて所要時間を整理するために最後までロジックのビットを追加することができます。

+0

これは素晴らしいです!私はこのフィルタの前に消毒することができるので、他のものと同じ文字列の規則に従うようにすることができます – Yasir

1

-

最終的な出力は次のようなものになるだろう。私は代わりに、=文字に基づいてキーと値のペアを探します。正規表現を作成し、exec()メソッドを使用してオブジェクトを反復して構築することができます。

var input = 'EXT-X-DATERANGE:ID="PreRoll_Ident_Open",START-DATE="2016-12-14T120000.000z",DURATION=3,X-PlayHeadStart="0.000",X-AdID="AA-1QPN49M9H2112",X-TRANSACTION-VPRN-ID="1486060788",X-TrackingDefault="1",X-TrackingDefaultURI="http,//606ca.v.fwmrm.net/ad/l/1?s=g015&n=394953%3B394953&t=1485791181366184015&f=&r=394953&adid=15914070&reid=5469372&arid=0&auid=&cn=defaultImpression&et=i&_cc=15914070,5469372,,,1485791181,1&tpos=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr="s=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr=' 

// Regex looks for any alpha character, colon, or hyphen before a =, then captures anything between the quotes and an optional comma after 
var pattern = /([A-Za-z:-]+)="([^"]+)",?/g; 

// Iterate the string using exec() and build the object along the way 
var match; 
var output = {}; 
while (match = pattern.exec(input)) { 
    output[match[1]] = match[2]; 
} 

console.dir(output); 
+1

私は '/(?:^|,)([A-Za-z\-]+?)(?:::AZ\-]+)?=(".+?"|\ d+?) (?=、| $)/ gm'より包括的な正規表現ですか? https://regex101.com/r/5XLR1O/1 –

+0

それは、その厄介なURLと引用符で囲まれていない整数値をキャプチャすることができます –

1

これは可能な解決策です。文字列を二重引用符で分割します(これはもちろん、値の中にエスケープされた二重引用符がないことを前提としています)。次に、i番目の値をキーに、i番目の+ 1の値をそのキーの値に設定して、結果の配列を循環させます。ここでのコードのようになります。

strings=nonparsed.split('"'); 
myObj={}; 
myObj[strings[0].slice(0,-1)]=strings[1]; 
for(i=2;i<strings.length;i+=2)myObj[strings[i].slice(1,-1)]=strings[i+1]; 
関連する問題