문제

내가 지원하는 데 필요한 정확한 문구(따옴표로 묶)에는 그렇지 않으면 공백으로 구분한 목록의 조건.따라서 분할 각각의 문자열에 의하여 공간이 문자가 충분하지 않습니다 더 이상.

예제:

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") 에서 결과입니다.
  • 사이 공간을 따옴표가 그대로 남아있을 것입니다.그래서가 있는 경우,세 가지 공간 사이 loremipsum, 들에 있을 것이 결과입니다.이 문제를 해결할 수 있습니에 의해 실행 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' ]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top