我正在为吉他和弦表提供语法突出显示服务。我试图突出吉他和弦而不是歌词。但是,当吉他和弦可以由和弦和扩展名组成时,情况就变得复杂了。
例如,
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“}
如何将正则表达式写入数组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])
目前为我工作。
答案 0 :(得分:0)
regex不必很长。您不需要像这样写出所有可能性:
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
之类的东西将不匹配。
很显然,如果在编译时不知道数组内容,则不能使用此类“技巧”,而必须写出所有可能性。