parsings 문자열:추출하는 단어 및 어구[JavaScript]
-
09-06-2019 - |
문제
내가 지원하는 데 필요한 정확한 문구(따옴표로 묶)에는 그렇지 않으면 공백으로 구분한 목록의 조건.따라서 분할 각각의 문자열에 의하여 공간이 문자가 충분하지 않습니다 더 이상.
예제:
input : 'foo bar "lorem ipsum" baz'
output: ['foo', 'bar', 'lorem ipsum', 'baz']
궁금해지는 이 달성 될 수 있는 하나의 정규식,오히려 수행하는 복잡한 구문 분석 또는 분할 및에 다시 작업입니다.
어떤 도움을 주시면 감사하겠습니다!
해결책
var str = 'foo bar "lorem ipsum" baz';
var results = str.match(/("[^"]+"|[^"\s]+)/g);
...배열을 반환합니다 당신이 찾고 있습니다.
그러나 참고:
- 경계 인용가 포함되어 있습니다,그래서로 제거할 수 있습니다
replace(/^"([^"]+)"$/,"$1")
에서 결과입니다. - 사이 공간을 따옴표가 그대로 남아있을 것입니다.그래서가 있는 경우,세 가지 공간 사이
lorem
고ipsum
, 들에 있을 것이 결과입니다.이 문제를 해결할 수 있습니에 의해 실행replace(/\s+/," ")
에서 결과입니다. - 이 없는 경우 폐쇄
"
후에ipsum
(i.e잘못 인용된 문구)당신은 겁니다:['foo', 'bar', 'lorem', 'ipsum', 'baz']
다른 팁
이것을 보십시오:
var input = 'foo bar "lorem ipsum" baz';
var R = /(\w|\s)*\w(?=")|\w+/g;
var output = input.match(R);
output is ["foo", "bar", "lorem ipsum", "baz"]
참고 거기에 추가 주위에 쌍따옴표 lorem ipsum
하지만 가정 입은 오른쪽에 따옴표로 묶는 장소:
var input2 = 'foo bar lorem ipsum" baz'; var output2 = input2.match(R);
var input3 = 'foo bar "lorem ipsum baz'; var output3 = input3.match(R);
output2 is ["foo bar lorem ipsum", "baz"]
output3 is ["foo", "bar", "lorem", "ipsum", "baz"]
고 탈출을 처리하지 않는 따옴표(그게 문제가 되는가?):
var input4 = 'foo b\"ar bar\" \"bar "lorem ipsum" baz';
var output4 = input4.match(R);
output4 is ["foo b", "ar bar", "bar", "lorem ipsum", "baz"]
는 방법에 대해,
output = /(".+?"|\w+)/g.exec(input)
다음달 출력을 잃습니다.
또,
output = /"(.+?)"|(\w+)/g.exec(input)
그런 다음 전달 n 출력을 잃게 빈 캡처.
덕분에 많은에 대한 빠른 응답!
여기에 요약 옵션에 대한 후손들:
var input = 'foo bar "lorem ipsum" baz';
output = input.match(/("[^"]+"|[^"\s]+)/g);
output = input.match(/"[^"]*"|\w+/g);
output = input.match(/("[^"]*")|([^\s"]+)/g)
output = /(".+?"|\w+)/g.exec(input);
output = /"(.+?)"|(\w+)/g.exec(input);
에 대한 기록,여기에의 가증한 것이었으로 올:
var input = 'foo bar "lorem ipsum" "dolor sit amet" baz';
var terms = input.split(" ");
var items = [];
var buffer = [];
for(var i = 0; i < terms.length; i++) {
if(terms[i].indexOf('"') != -1) { // outer phrase fragment -- N.B.: assumes quote is either first or last character
if(buffer.length === 0) { // beginning of phrase
//console.log("start:", terms[i]);
buffer.push(terms[i].substr(1));
} else { // end of phrase
//console.log("end:", terms[i]);
buffer.push(terms[i].substr(0, terms[i].length - 1));
items.push(buffer.join(" "));
buffer = [];
}
} else if(buffer.length != 0) { // inner phrase fragment
//console.log("cont'd:", terms[i]);
buffer.push(terms[i]);
} else { // individual term
//console.log("standalone:", terms[i]);
items.push(terms[i]);
}
//console.log(items, "\n", buffer);
}
items = items.concat(buffer);
//console.log(items);
'foo bar "lorem ipsum" baz'.match(/"[^"]*"|\w+/g);
경계는 따옴표를 얻을 포함하지
간단한 일반현 할 것입니다 하지만 큰따옴표로 묶여 있습니다.예:
'foo bar "lorem ipsum" baz'.match(/("[^"]*")|([^\s"]+)/g)
output: ['foo', 'bar', '"lorem ipsum"', 'baz']
편집:구타하여 shyamsundar,미안한 더블에 응답
하나는 쉽게 이해하고 일반적인 솔루션입니다.작품을 위해 모든 구분하고,'참여'자입니다.또한 지원합'합류한'단어는 그보다 더 두 단어의 길이....ie 목록
"hello my name is 'jon delaware smith fred' I have a 'long name'"
....
조금 같은 대답하여 AC 나 깔끔한...
function split(input, delimiter, joiner){
var output = [];
var joint = [];
input.split(delimiter).forEach(function(element){
if (joint.length > 0 && element.indexOf(joiner) === element.length - 1)
{
output.push(joint.join(delimiter) + delimiter + element);
joint = [];
}
if (joint.length > 0 || element.indexOf(joiner) === 0)
{
joint.push(element);
}
if (joint.length === 0 && element.indexOf(joiner) !== element.length - 1)
{
output.push(element);
joint = [];
}
});
return output;
}
는 경우에 당신은 단지 궁금하는 방법을 구축하는 regex 자신을 확인 할 수 있습 익스프레소(익스프레소 링크).그것은 훌륭한 도구를 구축하는 방법에 대한 자세한 내용 정기적인 표현으므로 어떤 구문은 것을 의미한다.
면 내장된 자신의 표현,다음을 수행할 수 있습니다 .match
니다.
이 될 수도 늦게 대답하지만,내가 관심에 응답
([\w]+|\"[\w\s]+\")
http://regex101.com/r/dZ1vT6/72
순수 자바 스크립트 예제
'The rain in "SPAIN stays" mainly in the plain'.match(/[\w]+|\"[\w\s]+\"/g)
출력:
["The", "rain", "in", ""SPAIN stays"", "mainly", "in", "the", "plain"]
ES6 지원하는 솔루션:
- 에 의해 분할 공간을 제외한 따옴표 안의
- 따옴표를 제거만을 위한 백슬래시 탈출 지수
- 탈출한 견적가는 견적
코드:
input.match(/\\?.|^$/g).reduce((p, c) => {
if(c === '"'){
p.quote ^= 1;
}else if(!p.quote && c === ' '){
p.a.push('');
}else{
p.a[p.a.length-1] += c.replace(/\\(.)/,"$1");
}
return p;
}, {a: ['']}).a
출력:
[ 'foo', 'bar', 'lorem ipsum', 'baz' ]