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

问题描述 投票:0回答:1

我正在为吉他和弦表格制作语法突出显示服务。我试图突出吉他和弦而不是歌词。然而,当吉他和弦由和弦+延伸组成时,它变得复杂。

例如,

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

Chord Editor working in progress

arrays regex optional
1个回答
0
投票

正则表达式不必很长。你不需要写出这样的可能性:

 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这样的东西是不匹配的。

显然,如果你的数组内容在编译时是未知的,你不能使用这样的“技巧”,并且必须写出所有可能性。

© www.soinside.com 2019 - 2024. All rights reserved.