从一个字符串中匹配单词但不包括开头和结尾的空格

4
我将尝试匹配一些单词,但没有成功。例如,假设我有以下字符串:
"word , word , two words, word"

我想做的是匹配单词,但不包括开头或结尾的空格。但它应该接受单词之间的空格。匹配结果的数组应该是:
["word","word","two words","word"]

我希望有人能够帮助我或者给我一些关于如何完成这个任务的见解?

谢谢。

编辑:我尝试并成功地将其分为两部分处理:

match(/[^(,)]+/g)

使用 map 函数从结果数组中删除所有空格:
map(value => value.trim());

但我希望只使用正则表达式来完成,不知道该如何操作。


2
post your attempts - Avinash Raj
尝试一下 "word , word , two words, word".match(/(\w+\s*\w+)/g) - Hassan Imam
@HassanImam 这不能适用于三个词。 - Sweeper
4个回答

5
\w[\w ]*?(?:(?=\s*,)|$)

解释:

\w[\w ]*?

匹配单词字符,中间可以有0个或多个空格,但不能在开头。 (懒惰模式)
(?:(?=\s*,)|$)

这个非捕获组会向前查找空格,后面跟着,字符串的结尾。

在这里试一试。


4
您可以在逗号两侧加上可选空格进行拆分:

var str = "word , , word , two words, word";

var arr = str.split(/(?:\s*,\s*)+/);

console.log(arr);

//=> ["word", "word", "two words", "word"]


1
感谢您的回答。 - user3477993
当您可以使用简单的分割选项时,为什么要选择具有前瞻和组等复杂正则表达式呢? - anubhava
例如,使用 split 只需要 58 步就能完成 https://regex101.com/r/HqYhqS/2,而使用您选择的正则表达式则需要 216 步。 - anubhava
@anubhava 我认为“问题”在于,在拆分时,空项可能会出现在最终结果中,请尝试使用"word , , word , two words, word"字符串进行正则表达式匹配。通过匹配,您将不会在结果中得到空元素。 - Wiktor Stribiżew
然后我们可以使用 str.split(/(?:\s*,\s*)+/) 或查看编辑过的内容。 - anubhava

3
你可以使用以下正则表达式:
(\w+\s*\w+)

匹配

  • 1个或多个单词字符
  • 0到N个空白字符(空格,制表符,换行符,回车符,垂直制表符)后跟
  • 1个或多个单词字符。

http://www.rexegg.com/regex-quickstart.html


感谢提供文档。我会仔细阅读它。 - user3477993

3
这可能是您在使用捕获组时正在寻找的内容,因此请迭代使用\1。
\s*([\w\s]+)\s*

感谢您抽出时间回答。 - user3477993

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