【发布时间】:2019-08-10 13:18:46
【问题描述】:
我正在尝试编写一个正则表达式来提取由空格分隔的单词(可选逗号 + 空格),从单词中删除“堆栈”前缀(如果有)。我正在尝试找到一个纯正则表达式解决方案,无需对结果进行任何后处理或类似(如果可能)。请看下面的尝试:
输入:
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"]
【问题讨论】:
-
spliting/stack|[, ]+/怎么样? -
JS 正则表达式不支持每个捕获组的捕获堆栈。如果将
+或*限定符设置为捕获组,则只有最后一次捕获将保留在捕获组内存缓冲区中。在 .NET、Python PyPi 正则表达式模块中是可能的,但在 JS 中是不可能的。改用多重加工或两遍方法来提取完整的重复子字符串,然后使用您的编程语言提供的字符串拆分方法进行拆分。 -
在 ECMA2018 中可以使用lookbehinds,在 Chrome 中尝试:
x.match(/(?<=stack)\w+|\b(?!stack)\w+/g) -
@revo 效果很好!只要回答,如果没有其他人提出更好的解决方案,我会接受你的。
-
你也可以拆分然后过滤:
x.split(/\bstack|,?\s+/).filter(Boolean)
标签: javascript regex regex-group