正则表达式以匹配字符串数组和可选的字符串数组

时间:2018-11-01 12:27:01

标签: arrays regex optional

我正在为吉他和弦表提供语法突出显示服务。我试图突出吉他和弦而不是歌词。但是,当吉他和弦可以由和弦和扩展名组成时,情况就变得复杂了。

例如,

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])目前为我工作。

Chord Editor working in progress

1 个答案:

答案 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之类的东西将不匹配。

很显然,如果在编译时不知道数组内容,则不能使用此类“技巧”,而必须写出所有可能性。