【发布时间】:2015-05-22 13:56:40
【问题描述】:
我正在尝试在为吉他/歌词格式化的标准文本文档中的和弦周围添加方括号,以使它们与 OnSong 应用程序更兼容。我有规则,但不明白如何匹配所有可能的组合。规则是:
- 和弦将以单个大写字母 A-G 开头
- 如果大写的 AG 后面跟着空格、换行符、#、b、m、sus、aug、dim、maj、min 或 / 我想读到下一个空格或换行符(因为标准吉他格式,像 F#min/E 这样的和弦是可能的,我不想费心把它全部拆开,我只想一直读到空格)
- 如果大写字母 A-G 后跟另一个不在上述列表中的字母,则正则表达式不匹配(例如,名称“Ed”不匹配)
- 如果由于“A”后面的单词不是有效的和弦,您可以弄清楚如何使“A small world”不匹配。
- 如果替换可以在新括号之前(不开始一行时)和之后删除一个空格(以保持对齐),则超级加分 - 有人向我指出,这将在关闭和弦上失败......这是完全可以接受的。
几个注意事项:这是一个帮助脚本......不需要完美。我现在是手工做的,所以偶尔错过是可以的。我不是试图解析和弦的细节,只是将它们包装在 [] 中。虽然标准布局是 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+] 时,我得到的结果好坏参半,我得到了更多我想要的东西,但也抛弃了我需要的东西。我想我只是在我的头上。任何帮助将不胜感激,任何关于它如何工作的解释都会更好。虽然我想要一个解决方案,但我也很想解释为什么它会起作用......
【问题讨论】:
-
所以
A# Eb // Oh man!会变成[A#][Eb] // Oh man!?由于这些和弦的紧密性,我们松散了对齐(添加括号)。 -
和弦相互对立的好点...有时对齐不起作用-我已经接受了这种命运:)
-
您将通过什么语言或工具使用正则表达式?这是什么动物?
-
没有考虑特定的语言...打算只制作一个小 shell 脚本或小型 Java 应用程序来处理文本文件。例如,这是吉他手/歌手获取歌曲的一种非常常见的格式。歌词上面有基本和弦的歌词。我还使用了一个可以读取文本文件的现场演奏应用程序,但是如果和弦被括号括起来,它会将它们转换为实际的和弦图,这非常有用。问题是,对于成千上万的歌曲文件,添加括号变得很麻烦。 (示例链接)tabs.ultimate-guitar.com/p/pearl_jam/alive_crd.htm