使用正则表达式将字符串拆分为单词数组

11

我想将一个字符串拆分成一个单词数组,但是我希望保留每个单词后面的空格。这是我尝试的代码:

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 "

我做错了什么?


如果您需要保留空格,为什么在第二个类中要添加 $+ - dierre
5个回答

13

考虑:

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

这会确保您不会错过任何字符(除了一些开头的空格,但\S*\s*可以处理这个问题)

您原始的正则表达式如下:

  • [a-z]+ - 匹配任意数量的字母(至少一个)
  • [$\s+] - 匹配单个字符 - $+或空格。由于此组后没有数量词,因此只匹配一个空格。

2
请尝试以下方法:
test.match(/\w+\s+/g); // \w = words, \s = white spaces

2
或者如果最后一个空格位是可选的:test.match(/\w+\s*/gi) - Wolph
@Wolph:为什么要使用不区分大小写的标志? - Dan Dascalescu
这将把"I'm coding"分成"I"、"m"和"coding"。 - Dan Dascalescu
@DanDascalescu:没有特定的原因,更多是一种习惯。 - Wolph
这个程序运行不好,如果你尝试输入以下句子:“月球是我们的天然卫星,即它围绕地球旋转!”,它会“吃掉”一些单词。 - Agat

1
你正在字符类中使用+。尝试在字符类外部使用*代替。
/[a-z]+\s*/gi;

+在字符类中被视为字面上的+,而不是元字符。 使用*将捕获可能跟随任何单词的零个或多个空格。


0

+在字符类中被当做字面量处理。你需要将它移到外面:[\s]+或者只是\s+$在类内也没有意义)。


0

需要更改的正则表达式中关键的部分是匹配空格或行尾的部分。

尝试:

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

或者,对于非捕获组(我不知道你是否需要在/g标志下使用它):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接