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

问题描述 投票:3回答:1

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

输入:

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"]
javascript regex regex-group
1个回答
1
投票

match()输出获得相同的上述结果的一种方法是使用正面观察。但是在ECMA2018之前,JavaScript中并不存在外观,因为我知道Google Chrome是唯一一个在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|[, ]+/))
© www.soinside.com 2019 - 2024. All rights reserved.