【发布时间】:2014-06-27 09:04:57
【问题描述】:
我正在尝试识别和处理文本中的和弦符号。在这样做的过程中,我最终尝试匹配一组重复模式,但只有最后一个匹配的实例出现在返回的数组中。
"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"]
【问题讨论】:
-
您不能“重用”捕获组:请参阅rexegg.com/regex-capture.html 中的自动生成新的捕获组 部分另外,我相信
[#|b]是指[#b]。您能否添加一些示例输入/要求以找到另一种做您想做的事情的方法? -
已更新示例。
标签: javascript regex