我正在尝试编写一个正则表达式,它提取由空格(也可以是逗号+空格)分隔的单词,从单词中删除'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"]
发布于 2019-03-20 07:24:53
从match()
输出中获得上述相同结果的一种方法是使用正向回溯。但是JavaScript直到ECMA2018才出现,而且据我所知,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))
另一种方法是拆分不需要的部分,但需要对当前的要求进行更多的澄清,因为它现在可能包含的不仅仅是words:
var str = "stackoverflow aa bbb, ccc"
console.log(str.split(/\bstack|[, ]+/))
https://stackoverflow.com/questions/55250729
复制相似问题