从空格(逗号)分隔的字符串中提取单词

时间:2019-03-19 22:11:52

标签: javascript regex regex-group

我正在尝试编写一个正则表达式,以提取用空格分隔的单词(可选用逗号+空格),并从单词(如果有)中删除“ stack”前缀。我试图找到一个没有任何后处理结果或类似结果(如果可能)的纯正则表达式解决方案。请参阅下面的尝试:

输入

var x = "stackoverflow aa bbb, ccc"

正则表达式

var rx = /((?:\s)?(?:stack)?(\w+))+/

预期输出

var match = x.match(rx);
["stackoverflow aa bbb ccc", "overflow", "aa", "bbb", "ccc"]

实际输出

["stackoverflow aa bbb ccc", " ccc", "ccc"]

1 个答案:

答案 0 :(得分:1)

match()输出中获得相同结果的一种方法是使用正向后视。但是直到ECMA2018为止,JavaScript中都不存在lookbehinds。据我所知,谷歌浏览器是唯一在其JavaScript引擎(V8)中实现此功能的浏览器。

这如何实现?我们需要两条路径来匹配单词:一条应该匹配stack之后的子字符串,另一条应该匹配所有单词,但要确保它们不以stack开头:

/(?<=\bstack)\w+|\b(?!stack)\w+/

如果必须使用空格和逗号,则应将它们考虑在内:

/(?:(?<=\bstack)\w+|\b(?!stack)\w+)(?=[, ]|$)/

JS代码:

var str = "stackoverflow aa bbb, ccc"
console.log(str.match(/(?:(?<=\bstack)\w+|\b(?!stack)\w+)(?=[, ]|$)/g))

另一种方法是拆分不需要的部分,但需要对当前要求进行更多的说明,因为它可能现在不仅仅包含单词

var str = "stackoverflow aa bbb, ccc"
console.log(str.split(/\bstack|[, ]+/))