我试图在标准文本文档中为和弦添加方括号,格式化为吉他/歌词,使它们与OnSong应用程序更兼容.我有规则,但不明白如何匹配所有可能的组合.规则是:
一些注意事项:这是一个帮助脚本......不需要完美.我现在手工做,所以偶尔的错过也没关系.我不是要解析和弦的细节,只是将它们包裹在[]中.虽然标准布局是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+]我会得到更多混合结果,这些结果可以提取我想要的东西,但也会丢弃我需要的东西.我想我只是在脑子里.任何帮助都会非常感激,任何有关它如何工作的解释都会更好.虽然我想要一个解决方案,但我也非常想解释它为什么有效......
这通过使用您的样本输入并达到您所有的"超级奖励积分"要求:
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)