2010-08-23 3 views
5

문자열을 단어 배열로 분할하려하지만 각 단어 뒤에 공백을두기를 원합니다. 여기에 내가 노력하고있어입니다 : 내가 기대정규 표현식을 사용하여 문자열을 단어 배열로 분할

var re = /[a-z]+[$\s+]/gi; 
var test = "test one two  three four "; 
var results = test.match(re); 

결과는 다음과 같습니다

[0]: "test " 
[1]: "one " 
[2]: "two " 
[3]: "three " 
[4]: "four " 

어떻게 생각 :

[0]: "test " 
[1]: "one " 
[2]: "two  " 
[3]: "three " 
[4]: "four " 

그러나, 각 단어 뒤에 한 칸까지 일치 잘못하고있는거야?

+0

왜 '추가 $'와'+'두번째 클래스에서? – dierre

답변

7

고려 :

: 어떤 문자를 놓치지 마세요 보장 할 것 (처음 부분에 약간의 공간 외에,하지만 \S*\s* 그 처리 걸릴 수 있습니다)

원래 정규식 읽기를

var results = test.match(/\S+\s*/g); 

  • [a-z]+은 - 문자의 수 (하나 이상)
  • 일치- 많은 단일 문자 - $, + 또는 공백 이 그룹 뒤의 한정 기호가 없으면 단일 공백 ​​만 일치시킵니다.
2

는 다음보십시오 : 당신은 문자 클래스 내에서 +를 사용하는

test.match(/\w+\s+/g); // \w = words, \s = white spaces 
+1

또는 공백의 마지막 비트가 선택 사항 인 경우 :'test.match (/ \ w + \ s */gi)' – Wolph

+0

@Wolph : 왜 대소 문자를 구분하지 않는 플래그입니까? –

+0

"I 'm coding"을 "I", "m"및 "coding"으로 나눕니다. –

1

. char 클래스 외부에서 *을 대신 사용해보십시오. 숯 클래스 내에

/[a-z]+\s*/gi; 

+

리터럴 +로하지 메타 문자로 취급된다. *을 사용하면 단어 뒤에 오는 0 개 이상의 공백을 캡처합니다.

0

+은 문자 클래스 내에서 문자 그대로 취해집니다. 바깥으로 이동해야합니다 : [\s]+ 또는 \s+ ($은 클래스 내부에는 의미가 없습니다.)

0

변경해야하는 RegEx의 필수 비트는 공백 또는 줄 바꿈과 일치하는 부분입니다.

시도 : non-capturing groups에 대한

var re = /[a-z]+($|\s+)/gi 

또는, (당신이 /g 플래그이 필요하면 나도 몰라) : 당신이 공간을 유지해야하는 경우

var re = /[a-z]+(?:$|\s+)/gi 
관련 문제