正则表达式:无全局标志的重复捕获组

丹·普林斯|

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

"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"]
zx81

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

我建议的方法是忘记捕获组,然后尝试拆分。但是Javascript并没有背后的痕迹(在指定分割定界符时很有用),据我所知,它没有像PHP那样具有分割字符串和保留定界符的选项。这导致我们采用两步法。

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

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

请对其进行修改以适合您的需求。

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

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

您可能需要调整令牌,但这是通常的想法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重复正则表达式捕获组的捕获部分

来自分类Dev

Python正则表达式findall捕获重复的组

来自分类Dev

Java正则表达式-捕获重复的组

来自分类Dev

多行正则表达式 - 捕获重复组的问题

来自分类Dev

正则表达式捕获组参考 > 重复?

来自分类Dev

捕获重复组的 Java 正则表达式

来自分类Dev

仅在正则表达式中捕获重复组

来自分类Dev

正则表达式由于重复捕获组而不是重复捕获组而不匹配

来自分类Dev

正则表达式:捕获组?

来自分类Dev

正则表达式,捕获组

来自分类Dev

正则表达式捕获组

来自分类Dev

正则表达式-重复捕获

来自分类Dev

正则表达式与重复组

来自分类Dev

正则表达式重复组

来自分类Dev

正则表达式:捕获组中的捕获组

来自分类Dev

捕获组中的正则表达式捕获组

来自分类Dev

正则表达式:捕获重复捕获组的所有单个实例

来自分类Dev

没有全局标志的Ruby正则表达式

来自分类Dev

正则表达式不捕获重复的可选捕获

来自分类Dev

使用Python正则表达式捕获组中的所有重复项

来自分类Dev

是否可以在正则表达式的替换中重复捕获的组?

来自分类Dev

使用正则表达式捕获可选的第二组数字(非重复)

来自分类Dev

正则表达式捕获一组的多个重复

来自分类Dev

正则表达式捕获文本,文本之间的重复组数未知

来自分类Dev

正则表达式可以在更大的匹配范围内重复捕获组?

来自分类Dev

使用Python正则表达式捕获组中的所有重复项

来自分类Dev

正则表达式,用于重复捕获某些标识符之间的组

来自分类Dev

正则表达式可以在更大的匹配范围内重复捕获组?

来自分类Dev

JavaScript正则表达式全局匹配组

Related 相关文章

热门标签

归档