2017-09-11 12 views
0

큰 문자열에서 값을 추출하는 가장 효율적인 방법을 찾고 있습니다.Javascript를 사용하여 문자열의 값을 구문 분석

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

이것은 아주 좋습니다! 나는이 필터 이전에 위생 처리를 할 수 있기 때문에, duration은 다른 문자열과 동일한 문자열 규칙을 따를 수있다. – 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

나는/(?:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) (? =, | $)/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];