我正在尝试编写一个正则表达式,以提取用空格分隔的单词(可选用逗号+空格),并从单词(如果有)中删除“ 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"]
答案 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|[, ]+/))