/ \ s / g와 / \ s + / g 사이에 차이가 있습니까?


87

공백 문자가 포함 된 문자열이있는 경우 :

var str = '  A B  C   D EF ';

그리고 우리는 문자열에서 공백을 제거하려고합니다 (이것을 원합니다 :) 'ABCDEF'.

둘 다 :

str.replace(/\s/g, '')

이:

str.replace(/\s+/g, '')

올바른 결과를 반환합니다.

이것은이 +상황에서 불필요 하다는 것을 의미합니까 ? 이 상황에서이 두 정규식간에 차이가 있습니까 (예 : 어떤 식 으로든 다른 결과를 생성 할 수 있음)?


업데이트 : 성능 비교- /\s+/g더 빠릅니다. 여기를 참조하십시오 : http://jsperf.com/s-vs-s


1
vidas stackoverflow.com/questions/5963182/… 이것이 당신이이 질문을하게 만든 것이라고 확신합니다;) (답변에 대한 귀하의 의견)
rsplak

2
각 공백을 개별적으로 교체해야하는 \s+동안 공백 덩어리를 대체 할 수 있기 때문에 더 빠르다고 상상할 수 있습니다 \s.
KooiInc

1
@KooiInc : 맞습니다. 일치 / 교체 횟수가 더 적기 때문입니다.
BoltClock

답변:


214

첫 번째 정규식에서 각 공백 문자 는 한 문자 씩 빈 문자열로 대체됩니다.

두 번째 정규식에서 각 연속 공백 문자 문자열은 +.

그러나 0에 다른 것을 곱한 것과 마찬가지로 두 방법 모두 정확히 같은 방식으로 공백을 제거하는 것처럼 보입니다.

대체 문자열을로 변경하면 '#'차이가 훨씬 더 명확 해집니다.

var str = '  A B  C   D EF ';
console.log(str.replace(/\s/g, '#'));  // ##A#B##C###D#EF#
console.log(str.replace(/\s+/g, '#')); // #A#B#C#D#EF#

27

\s"하나의 공백"을 \s+의미하고 "하나 이상의 공백"을 의미합니다.

그러나 /g플래그 (모든 항목 교체)를 사용하고 빈 문자열로 교체하기 때문에 두 표현식은 동일한 효과를 갖습니다.


그러나 두 번째 버전은 아마도 더 빠를 것입니다.
Tim Pietzcker

의미합니까, \ s +를 사용하는 경우 / g를 사용할 필요가 없습니다
Gaurav

1
@Gaurav : 아니요. 그러면 첫 번째 만 대체 \s+하고 나머지는 그대로 둡니다. 예를 들어, ' foo bar '.replace(/\s+/, '')당신만을 줄 것이다 'foo bar ' HTML은 하나에 두 개의 공백을 응축 아아 편집
BoltClock

@Gaurav 나는 그렇게 생각하지 않는다. g수정자를 생략하면 공백 블록의 첫 번째 항목 만 대체됩니다.
KooiInc

10

일치 상황에서 첫 번째는 공백 당 하나의 일치를 반환하고 두 번째는 각 공백 그룹에 대한 일치를 반환합니다.

빈 문자열로 바꾸므로 결과는 동일합니다. 예를 들어 'x'로 바꾸면 결과가 달라집니다.

str.replace(/\s/g, '') 'xxAxBxxCxxxDxEF'를 반환합니다.

동안 str.replace(/\s+/g, '')'xAxBxCxDxEF'를 반환합니다.

때문에 \s'X'와 각각 일치하는 각 교체 공백, 및 \s+하나의 'X'여러 순차 공백 교체 공백의 일치 그룹.


3

+"하나 이상의 문자"를 의미하고 플러스가 없으면 "한 문자"를 의미합니다. 귀하의 경우에는 둘 다 동일한 결과를 얻습니다.

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