我正在尝试在为吉他/歌词格式化的标准文本文档中的和弦周围添加方括号,以使它们与 OnSong 应用程序更兼容。我有规则,但不明白如何匹配所有可能的组合。规则是:
- 和弦将以单个大写 A-G 开头
- 如果大写 A-G 后跟空格、换行符、#、b、m、sus、aug、dim、maj、min 或 / 我想阅读直到下一个空格或换行符(因为标准吉他格式) ,像 F#min/E 这样的和弦是可能的,我不想把它全部分开,我只想继续阅读直到空间)
- 如果大写 A-G 后跟不在上面列表中的另一个字母,则正则表达式不应匹配(例如名称“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
应该变成:
[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
我的第一次尝试让我接近:
([A-G]((?!\s).)*)
但这也选取了以这些字母开头的单词。我现在兜了一圈,只得到了:
\b([CDEFGAB](#|##|b|bb|sus|maj|min|aug)?\b)
当我尝试使用时[^\s+]
我得到的结果好坏参半,得到了更多我想要的东西,但也放弃了我需要的东西。我想我已经超出了我的能力范围。任何帮助将不胜感激,任何有关其工作原理的解释都会更好。虽然我想要一个解决方案,但我也很想解释它为什么有效......
这通过使用您的示例输入并实现您所有的“超级奖励积分”要求:
String output = input.replaceAll("(?m)(^| )([A-G](##?|bb?)?((sus|maj|min|aug|dim)\\d?)?(/[A-G](##?|bb?)?)?)( (?!\\w)|$)", "[$2]");
此代码将其转换为(作为嵌入线路费用的单个字符串):
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
进入这个:
[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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)