2012-09-01 2 views
0

구분 :정규식 내가 정규식 마스터 아니지만, 내가 JS에서이 결과를 줄 것이다 정규식을 찾고 있어요 문자열

var regex = ...; 
var result = '"a b", "c, d", e f, g, "h"'.match(regex); 

및 결과가 될 것

['"a b"', '"c, d"', 'e f', 'g', '"h"'] 

편집 :

이스케이프 따옴표 처리 할 필요가 없습니다. 그것은 사용자가 입력 할 수 있어야하는 태그 필드에 대해 다음과 같습니다

이 tag1를, tag2로

뿐만 아니라

"뉴욕, 미국", "미국 보스턴"

EDIT2 : 놀랍도록 빠른 답변을 주셔서 감사합니다.

+2

그 규칙은 무엇입니까? 두 개의 따옴표 사이에있는 경우를 제외하고는 쉼표로 구분합니까? –

+0

그건 기본적으로 예입니다 – Jelle

답변

3

난 그냥 루프를 사용하십시오 다음과 같이 칼을 수있는 String#trim 필요

if(!String.prototype.trim) { 
    String.prototype.trim = function() { 
     return this.replace(/^\s+/, '').replace(/\s+$/, ''); 
    }; 
} 
+0

+1. 이것은 좋은 방법입니다. – icktoofay

+0

이스케이프 된 큰 따옴표가 따옴표 안에 허용되는 경우 유일한 단점이 될 것이라고 생각합니다. 아직도 +1 +1 –

+2

@ user1600680 : 나는 그것을 고려했지만 결정을 내렸고, 지금은 결정할 것이다 :) 잠깐 ... – Ryan

1

정규 표현식은이 작업에 가장 적합한 도구가 될 수 없습니다. 대신 문자를 반복하고 수행 할 작업을 결정하면됩니다. 문자를 통해

  • 루프 :이 견적
    • 가 여기에 몇 가지 그렇게 할 의사가있어?
      • 견적 플래그를 토글합니다. 그것은 인용 플래그가 설정되지 않은 쉼표
    • 인가?
      • 누적 된 문자열을 배열에 추가하십시오.
      • 누적 된 문자열을 지 웁니다.
      • 이 반복의 나머지 단계는 건너 뜁니다.
    • 문자열에 대한 현재의 문자가 축적되고 추가합니다.
  • 는 축적 된 문자열이 비어 있지?
    • 누적 된 문자열을 배열에 추가하십시오.
  • 선택적으로, 상기 어레이의 모든 문자열 중 공백 오프 스트립.
    문자열을 배열에 추가 할 때도이 작업을 수행 할 수 있습니다.

    function splitCSVFields(row) { 
        var result = []; 
        var i, c, q = false; 
        var current = ''; 
    
        for(i = 0; c = row.charAt(i); i++) { 
         if(c === '"') { 
          current += c; 
          q = !q; 
         } else if(c === ',' && !q) { 
          result.push(current.trim()); 
          current = ''; 
         } else { 
          current += c; 
         } 
        } 
    
        if(row.length > 0) { 
         result.push(current.trim()); 
        } 
    
        return result; 
    } 
    

    참고 :

+0

[minitech의 대답] (http://stackoverflow.com/a/12231349)이 구체적인 구현입니다. – icktoofay

0
var result = input.match(/(?:(?:"((?:[^"]|"")*)")|([^",\n]*))/g); 
for (var i = 0; i < result.length; i++) { 
    result[i] = result[i].replace(/^\s*/, "").replace(/\s*$/, ""); 
    if (result[i].length === 0) { 
    result.splice(i--, 1); 
    } 
} 

시험이 코드 here합니다.

관련 문제