【问题标题】:Regex to match array of strings and optional array of strings正则表达式匹配字符串数组和可选的字符串数组
【发布时间】:2018-11-01 12:27:01
【问题描述】:

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

例如,

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

如何将正则表达式写入 Array 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

【问题讨论】:

  • 这就像写一个与\b(?:[BE]b?|[ACDFG]#?)(?:sus|maj|[-1-9\/m])*(?!\S)类似的正则表达式。在此处查看现场演示regexr.com/42b43
  • 你也想在(capo 1 for Eb) 中匹配Eb 吗?
  • 如果Eb) 中的Eb 应该匹配,这是否意味着) 就像Array2 中的可选字符一样工作?
  • revo,谢谢!但该正则表达式无法捕获 D/F#。如何一次写入包含数组 1 字符串,后跟可选数组 2 字符串?
  • 根据您当前的规则,D/F# 不应作为一个匹配项返回。因为你说它应该匹配来自 Array1 的强制值(这里是 D),然后是来自 Array2 的任何可选值(它是 /)。所以它应该匹配 D/ 中的 D/F# 然后 - 如果你需要 - F# 作为另一个匹配。请详细说明这些冲突。

标签: arrays regex optional


【解决方案1】:

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

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

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

【讨论】:

  • 你不应该在最后使用\b,因为你不知道/-是否会出现在最后。请参阅我上面的评论。
  • @revo 哦,我明白了问题所在。但是您的解决方案与括号中的 Eb 不匹配...现在正在考虑新的东西...
  • @revo (?!\w) 呢?
  • 那么这应该由 OP 清除,因为现在它就像第二个数组中的可选字符。
  • 我应该避免猜测,直到 OP 把事情弄清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多