【发布时间】:2018-11-01 12:27:01
【问题描述】:
我正在为吉他和弦表制作语法突出显示服务。我试图突出吉他和弦而不是歌词。但是,当吉他和弦可以由和弦+扩展组成时,它就变得复杂了。
例如,
God Is So Good
(capo 1 for Eb)
[Verse 1]
D Em A7 D
God is so good, God is so good;
D G Em D A7 D
God is so good, He’s so good to me.
我需要正则表达式来捕获“D”、“E”以及“Dm”、“Em7”、“Dmaj7”、“D/F#”等。
我这里有两个数组,第一个数组捕获和弦,第二个数组是可选扩展。
Array1 = {“A”、“Bb”、“A#”、“B”、“C”、“C#”、“D”、“D#”、“Eb”、“E”、“F”、 “F#”、“G”、“G#”}
Array2 = {“”、“/”、“m”、“-”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“ 8”、“9”、“sus”、“maj”}
如何将正则表达式写入 Array 1 中的 contain 字符串,然后写入 Array 2 中的 optional 字符串?
我最初的想法是创建一个长正则表达式来捕获所有可能的和弦表达式,但我想知道是否有更好的方法。
编辑:新示例: revo,该正则表达式不适用于此示例:也应匹配 D/F# 之类的内容。
G D/F#
How great is our God, sing with me,
Em7 D/F#
How great is our God, all will see,
编辑:\b(?:[BE]b?|[ACDFG]#?)(?:sus|maj|[-1-9/m])*(?!.[a-z]|[A-Z]) 目前为我工作。
【问题讨论】:
-
这就像写一个与
\b(?:[BE]b?|[ACDFG]#?)(?:sus|maj|[-1-9\/m])*(?!\S)类似的正则表达式。在此处查看现场演示regexr.com/42b43 -
你也想在
(capo 1 for Eb)中匹配Eb吗? -
如果
Eb)中的Eb应该匹配,这是否意味着)就像Array2中的可选字符一样工作? -
revo,谢谢!但该正则表达式无法捕获 D/F#。如何一次写入包含数组 1 字符串,后跟可选数组 2 字符串?
-
根据您当前的规则,
D/F#不应作为一个匹配项返回。因为你说它应该匹配来自 Array1 的强制值(这里是D),然后是来自 Array2 的任何可选值(它是/)。所以它应该匹配D/中的D/F#然后 - 如果你需要 -F#作为另一个匹配。请详细说明这些冲突。