标准吉他歌词/和弦包围的正则表达式

Igl*_*ite 6 regex guitar

我试图在标准文本文档中为和弦添加方括号,格式化为吉他/歌词,使它们与OnSong应用程序更兼容.我有规则,但不明白如何匹配所有可能的组合.规则是:

  • 和弦将以单一资本AG开始
  • 如果首都AG后跟一个空格,换行符,#,b,m,sus,aug,dim,maj,min或/我想读到下一个空格或换行符(因为标准吉他格式化) ,像F#min/E这样的和弦是可能的,而不是费心分开它,我只想继续阅读直到太空)
  • 如果首都AG后跟另一个不在上面列表中的字母(例如名称"Ed"不匹配),则正则表达式不匹配
  • 奖励积分如果你能弄清楚如何使"小世界"不匹配,因为"A"这个词不是有效的和弦.
  • 超级奖励积分,如果替换可以删除之前(当没有开始一行)和新的括号后(为了保持对齐) - 我已经指出,这将在关闭的和弦上失败...这完全是可以接受的.

一些注意事项:这是一个帮助脚本......不需要完美.我现在手工做,所以偶尔的错过也没关系.我不是要解析和弦的细节,只是将它们包裹在[]中.虽然标准布局是1行和弦,1行歌词,但这不能指望,所以我知道有些场景偶尔会失败.

测试源(和弦是随机用于测试目的,以防任何音乐家打算在可怕的音乐上插话):

Db    Dsus4/F#           A            Cbmin/C
A man can't be asked for that much to do
D/F#        G         A           D#/E
And I can't sweep you off of your feet
Run Code Online (Sandbox Code Playgroud)

应该变成:

[Db]  [Dsus4/F#]         [A]          [Cbmin/C]
A man can't be asked for that much to do
[D/F#]      [G]       [A]         [D#/E]
And I can't sweep you off of your feet
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试让我接近:

([A-G]((?!\s).)*)
Run Code Online (Sandbox Code Playgroud)

但是那些从那些字母开始的单词也是如此.我现在已经四处走动,只能到达:

\b([CDEFGAB](#|##|b|bb|sus|maj|min|aug)?\b)
Run Code Online (Sandbox Code Playgroud)

当我尝试使用时,[^\s+]我会得到更多混合结果,这些结果可以提取我想要的东西,但也会丢弃我需要的东西.我想我只是在脑子里.任何帮助都会非常感激,任何有关它如何工作的解释都会更好.虽然我想要一个解决方案,但我也非常想解释它为什么有效......

Boh*_*ian 7

这通过使用您的样本输入并达到您所有的"超级奖励积分"要求:

String output = input.replaceAll("(?m)(^| )([A-G](##?|bb?)?((sus|maj|min|aug|dim)\\d?)?(/[A-G](##?|bb?)?)?)( (?!\\w)|$)", "[$2]");
Run Code Online (Sandbox Code Playgroud)

此代码将此转换为(具有嵌入式线路费用的单个字符串):

Db    Dsus4/F#           A            Cbmin/C
A man can't be asked for that much to do
D/F#        G         A           D#/E
And I can't sweep you off of your feet
Run Code Online (Sandbox Code Playgroud)

进入:

[Db]  [Dsus4/F#]         [A]          [Cbmin/C]
A man can't be asked for that much to do
[D/F#]      [G]       [A]         [D#/E]
And I can't sweep you off of your feet
Run Code Online (Sandbox Code Playgroud)