我正在为吉他和弦表格制作语法突出显示服务。我试图突出吉他和弦而不是歌词。然而,当吉他和弦由和弦+延伸组成时,它变得复杂。
例如,
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”,“你的”,“maj”}
我如何将正则表达式写入数组1中的contain
字符串,然后是数组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])
目前为我工作。
正则表达式不必很长。你不需要写出这样的可能性:
A|A#|B|Bb|C|C#...
你可以缩短第一部分:
[BE]b?|[ACDFG]#?
缩短第二部分:
sus|maj|[-1-9\/m]
而你只需将两者结合起来:
\b(?:[BE]b?|[ACDFG]#?)(?:sus|maj|[-1-9\/m])?(?:sus|maj|[-1-9\/m])
请注意,\b
在开始时和(?:sus|maj|[-1-9\/m])
在结束时。这可确保作为单词一部分的子字符串不匹配。因此,像“上帝”中的G
这样的东西是不匹配的。
显然,如果你的数组内容在编译时是未知的,你不能使用这样的“技巧”,并且必须写出所有可能性。