Regex для сопоставления массива строк и необязательного массива строк - PullRequest
0 голосов
/ 01 ноября 2018

Я делаю сервис подсветки синтаксиса для гитарных аккордов. Я пытаюсь выделить гитарные аккорды, а не слова. Однако, это становится сложным, когда гитарные аккорды могут состоять из аккордов + расширений.

Например,

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 "}

Как мне записать регулярное выражение в contain строки в Array 1 , за которыми следуют optional строки в Array 2 ?

Первоначально я решил создать длинное регулярное выражение, которое бы охватывало все возможные выражения аккордов, но я хочу знать, есть ли лучший способ.

Редактировать: новый пример: 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,

edit: \b(?:[BE]b?|[ACDFG]#?)(?:sus|maj|[-1-9/m])*(?!.[a-z]|[A-Z]) у меня сейчас работает.

Работает редактор аккордов

1 Ответ

0 голосов
/ 01 ноября 2018

Регулярное выражение не должно быть очень длинным. Вам не нужно выписывать каждую такую ​​возможность:

 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 в «Боге», не будут совпадать.

Очевидно, что если содержимое вашего массива неизвестно во время компиляции, вы не можете использовать такие «хитрости» и должны выписывать каждую возможность.

...