【问题标题】:Extracting words from a space (comma) separated string从空格(逗号)分隔的字符串中提取单词
【发布时间】: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


【解决方案1】:

match() 输出中获得相同的上述结果的一种方法是使用正向回溯。但是在 ECMA2018 之前,JavaScript 中不存在lookbehinds,据我所知,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|[, ]+/))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2020-03-20
    相关资源
    最近更新 更多