2010-08-23 73 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 2010-08-23 14:37:40

回答

7

考慮:

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

這將確保你不會錯過任何字符(除了在開始的幾個空格,但\S*\s*可以照顧那個)

你原來的正則表達式如下:

  • [a-z]+ - 匹配任意數量的字母(至少一個)
  • [$\s+] - 很多單個字符 - $,+或空白。在這個組之後沒有量詞,你只能匹配一個空格。
2

嘗試以下操作:

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

或者如果最後一位空白是可選的:'test.match(/ \ w + \ s */gi)' – Wolph 2010-08-23 14:36:25

+0

@Wolph:爲什麼不區分大小寫的標誌? – 2014-04-17 08:24:43

+0

這會將「我正在編碼」分成「我」,「米」和「編碼」。 – 2014-04-17 08:26:06

1

您正在使用+炭類中。改爲在char類外使用*

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

+炭類內部被視爲文字+而不是作爲元炭。 使用*將捕獲可能跟在任何單詞後面的零個或多個空格。

0

+是從字面類的字面意思。你必須把它移到外面:[\s]+或者只是\s+$在課堂內部沒有任何意義)。

0

需要更改的RegEx的重要部分是與空白或行尾相匹配的部分。

嘗試:

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

,或者對於non-capturing groups(我不知道你是否需要這個與/g標誌):

var re = /[a-z]+(?:$|\s+)/gi 
相關問題