javascript - 正则表达式:没有全局标志的重复捕获组

标签 javascript regex

我正在尝试识别和处理文本中的和弦符号。在这样做的过程中,我最终尝试匹配一组重复模式,但只有最后一个匹配的实例出现在返回的数组中。

"Amaj13#11".match(/([a-g][#|b]?)(?:(maj|m|sus|dim|#|b)?(\d+))*/i)

// Expected
["Amaj13#11", "A", "maj", "13", "#", "11"]

// Actual
["Amaj13#11", "A", "#", "11"]

应该捕获其他术语的组是:(?:(maj|m|sus|dim|#|b)?(\d+))*

据我了解,这是因为没有全局标志不存在,当我添加它时,它会正确提取并匹配正确的部分并返回字符串 "Amaj13#11",这表明回到正题。

我如何使用全局标志并将返回的组件放入数组中,或者在没有它的情况下重复捕获组?

一些示例输入和所需的输出。

"C#m9#5" // ["C#", "m", "9", "#", "5"]
"Bsus2" // ["B", "sus", "2"]
"Db#11" // ["Db", "#", "11"]
"Fmaj6b2" // ["F", "maj", "6", "b", "2"]

最佳答案

这是一个有趣的问题,因为虽然它似乎挑战 javascript,但它有一个简单的答案。

我建议的方法是忘记捕获组并尝试拆分。但是 Javascript 没有 lookbehinds(在指定分割分隔符时很有用),据我所知,它没有像 PHP 那样分割字符串并保留分隔符的选项。这使我们采用了两步法。

第一步:决定我们要分割的地方。根据您所说的,听起来我们正在研究一个简单的正则表达式,例如

[A-Gb#]|(?:maj|sus)|\d+

请修改它以满足您的需要。

第二步:在分割点插入标记。为此,我们使用替换:

readyToSplit = str.replace(/([A-Gb#]|(?:maj|sus)|\d+)/mg, "$1[SPLIT]");

这给了我们:

A[SPLIT]maj[SPLIT]13[SPLIT]#[SPLIT]11[SPLIT]

第三步:拆分。

result = readyToSplit.split(/\[SPLIT\]/m);

这给了我们:Amaj13#11

您可能需要调整 token ,但这是一般的想法。

关于javascript - 正则表达式:没有全局标志的重复捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23567743/

相关文章:

javascript - 使用纯 javascript 围绕中心缩放 SVG

javascript - 无法使用用 php 编写的 javascript 删除 iframe 内的元素

javascript - 如何在 JavaScript 中设置全局变量和全局函数

regex - 日志文件中的百分比差异

java - 正则表达式操作的优先级

javascript - AJAX 未输出正确的内容

javascript - 为开发构建 webpack 时出现语法错误

匹配 4 组字母/数字的正则表达式,用连字符分隔

php - 允许的命名子模式字符

c# - 将数字部分从字母数字中分离出来