''로 문장을 분할하고 주변 공백을 제거합니다.


82

이 코드가 있습니다.

var r = /(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*){0,}$/
var s = "   a   ,  b  , c "
var m = s.match(r)
m => ["   a   ,  b  , c ", "a", "c"]

전체 문자열이 일치하는 것처럼 보이지만 어디로 "b"갔습니까? 차라리 얻을 것으로 기대합니다.

["   a   ,  b  , c ", "a", "b", "c"]

그래서 나는 m.shift()같은 결과로 할 수 s.split(',')있지만 공백을 제거했습니다.

정규식에 실수가 있거나 오해가 String.prototype.match있습니까?


참고로 {0,}*.
pimvdb 2011 년

또한, s도있을 수 있습니다 ' a, c'또는'a,b,c d e, f'
meandre

난 \ s의 공간을 변경할 수 있습니다
meandre

답변:


190

복잡한 정규 표현식을 사용하지 않고도이 작업을 수행하는 매우 간단하고 직접적인 방법이 있습니다.

var str = "   a   ,  b  , c "
var arr = str.split(",").map(function(item) {
  return item.trim();
});
//arr = ["a", "b", "c"]

네이티브 .map는 IE9 이상에서 지원됩니다 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map


또는 ES6 +에서는 더 짧아집니다.

var arr = str.split(",").map(item => item.trim());

그리고 완성을 위해 여기에 타이핑 정보가있는 Typescript에 있습니다.

var arr: string[] = str.split(",").map((item: string) => item.trim());

4
그냥 까다로운로, 당신은지도 인수 주위에 괄호로 멀리 할 수 있습니다 : var arr = str.split(",").map(item=>item.trim());
데이비드 존스 (David Jones)

나는 이것에 대해 @DavidJones와 함께 있습니다. 수정하면 답이 좋을 것입니다. 제 사건에 많은 도움을 주셨습니다. 감사합니다!
이미 takenindeed dec

네 좋은 점-답변이 업데이트되었습니다. 나는 보통 Typescript를 작성하기 때문에 개인적으로 항상 괄호를 추가하고, 어떤 것이 한 눈에 항상 알 수 있도록 명시적인 유형 정보를 제공하는 것을 좋아합니다.
CBarr

이것은 훌륭한 대답 Chris입니다.
주기적

간단하고 최고 !!
Rahul Sonwanshi

22

복잡한 정규식없이 이것을 시도 할 수 있습니다.

var arr = "   a   ,  b  , c ".trim().split(/\s*,\s*/);
console.log(arr);


15

짧은 대답 : 사용 m = s.match(/[^ ,]/g);


마지막 그룹이 가장 최근 일치 (= c) 와 일치하기 때문에 RE가 예상대로 작동하지 않습니다 . 생략 {1,}$하면 반환 된 일치 항목은입니다 " a , b ", "a", "b". 간단히 말해, RegExp는 flag 를 사용 하지 않는 한 지정된 그룹만큼 일치를 반환합니다 . 이 경우 반환 된 목록은 일치하는 모든 하위 문자열에 대한 참조를 보유합니다.global/g

효과를 얻으려면 다음을 사용하십시오.

m = s.replace(/\s*(,|^|$)\s*/g, "$1");

이렇게 하면 공백으로 둘러싸인 모든 쉼표 ( ,), 시작 ( ^) 및 끝 ( $)이 원래 문자 ( ) 로 대체됩니다 comma.

배열을 얻으려면 다음을 사용하십시오.

m = s.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/);

이 RE는 그때까지 문자열을 분할, 문자열 (시작과 끝의 공백을 제거 트림 <any whitespace>,<any whitespace>. 공백 문자는 줄 바꿈과 탭을 포함합니다. 당신이에 충실하려면 공간 전용 공간 (사용 ) 대신 \s.


@Andrew RE에 대한 설명을 확장했습니다. split방법에 대한 두 번째 예를 참조하십시오 .
Rob W

나는 이미 다른 답변에 대한 의견으로 게시했습니다. 나는 하나의 정규 표현식과 하나의 작업으로 할 수 있습니까? 아니면 js 정규 표현식이 충분히 똑똑하지 않습니까?
meandre 2010 년

@Andrew 예, s.match(/[^ ,]+/g). 내 답변 상단에서 언급했듯이 /g일치하는 모든 하위 문자열을 반환하는 전역 플래그입니다.
Rob W

@Andrew : 하나의 캡처 그룹은 얼마나 많은 수량자를 추가하든 상관없이 하나의 일치 항목을 만듭니다. 일치시킬 경우 a, b그리고 c, 당신은 (포함되지 괄호 세 쌍의 필요 (?:...):)/(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)$/
user123444555621

@RobW, s.match (/ [^,] + / g)는 내가 필요로하는대로 정확히 작동합니다. 답변에 추가해주세요
meandre


8

당신은 당신의 목적을 위해 이것을 할 수 있습니다
편집 : 주석에 제안 된대로 두 번째 교체 제거. s.replace(/^\s*|\s*$/g,'').split(/\s*,\s*/)
먼저 replace문자열을 트리밍 한 다음 split함수가 '\s*,\s*'. 이것은 ["a", "b", "c"]입력에 출력 을 제공합니다" a , b , c "

정규식이 'b'를 캡처하지 않는 이유는 캡처 된 그룹을 반복하므로 마지막 발생 만 캡처됩니다. 자세한 내용은 여기 http://www.regular-expressions.info/captureall.html


모든 공백을 지우고 싶지 않습니다. 쉼표 주변이나 문자열의 시작 / 끝 부분 만 삭제합니다
meandre

@Andrew는 모든 공백이 아닙니까? 또는 나누고 싶은 문장이 있습니까?
David Hellsing 2011 년

s.replace (/ ^ \ s * /, '') .replace (/ \ s * $ /, '') .split (/ \ s *, \ s * /)는 이것을 할 수 있습니다
meandre

@Andrew 귀하의 요구 사항에 따라 답변을 변경했습니다.
Narendra Yadala 2011 년

6

그래서 마지막으로 내가 /(?=\S)[^,]+?(?=\s*(,|$))/g필요한 것을 정확히 제공하는를 사용했습니다. 모든 문장은 주변 공백없이 ','로 나뉩니다.

'       a,    OMG     abc b a b, d o WTF        foo     '.
  match( /(?=\S)[^,]+?(?=\s*(,|$))/g )
=> ["a", "OMG     abc b a b", "d o WTF        foo"]

많은 감사합니다!


내가 이해하는 의미는 다음과 같습니다. 내가 맞지 않으면 수정 해주세요 : (?=\S)-앞에 공백이 없을 때만 캡처 시작 [^,]+-가능한 한 '쉼표 ?가 아닌'캡처-하지만 다음 그룹에서 캡처 할 수있는 것은 캡처하지 않음 (?=\s*(,|$))-이전에 모든 공백 캡처 쉼표 또는 문자열 끝 /g-모든 문자열 반복
meandre

1

정규식을 계속 사용하려면 ES6를 사용하지 않고 코드를 단순하게 유지하십시오.

s.replace(/ /g, '').split(",")

1-모든 공백 (/ / g)을 빈 문자열 ( '')로 바꿉니다.

2-그런 다음 배열로 분할

Et voila


이것은 가장 간단하고 복잡한 대답입니다.
Blazes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.