6

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

  • 和弦将以单个大写 AG 开头
  • 如果大写 AG 后跟空格、换行符、#、b、m、sus、aug、dim、maj、min 或 / 我想读到下一个空格或换行符(因为标准吉他格式,像 F#min/E 这样的和弦是可能的,我不想费心把它全部分开,我只想一直读到空格)
  • 如果大写 AG 后面跟着另一个不在上面列表中的字母,则正则表达式不应匹配(例如,名称“Ed”不应匹配)
  • 如果您能弄清楚如何使“A small world”不匹配,因为“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+]我得到的结果好坏参半,得到了更多我想要的东西,但也抛弃了我需要的东西。我想我只是在我的头上。任何帮助将不胜感激,任何关于它如何工作的解释都会更好。虽然我想要一个解决方案,但我也很想解释它为什么有效......

4

5 回答 5

7

这通过使用您的示例输入并达到您所有的“超级奖励积分”要求:

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
于 2015-03-19T14:04:40.207 回答
3

对于您提供的案例,我有一些工作正则表达式,但不确定它对其他人如何工作。问题是一行可以以 开头A,也可以在歌曲行中。我尝试使用负前瞻来解决它,检查和弦后面是否跟着空格和字母数字。如果有空格和字母数字,我们不匹配这个和弦。由于和弦可以在 之后重复/,因此我将模式加倍。

\b([CDEFGAB](?:b|bb)*(?:#|##|sus|maj|min|aug)*[\d\/]*(?:[CDEFGAB](?:b|bb)*(?:#|##|sus|maj|min|aug)*[\d\/]*)*)(?=\s|$)(?! \w)

看看演示

于 2015-03-19T12:54:06.993 回答
3

看一下这个:

/([A-G](#|b)?)(\(?(M|maj|major|m|min|minor|dim|sus|dom|aug)?(\+|-|add)?\d*\)?)(\/([A-G](#|b)?))?/g

我从chord-transposer中获取了它:

var XRegExp = require("xregexp");

// Chromatic scale starting from C using flats only.
var FLAT_SCALE = ["C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "Cb"];

// Chromatic scale starting from C using sharps only.
var SHARP_SCALE = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];

// Regex for recognizing chords
var ROOT_PATTERN = '(?<root>[A-G](#|b)?)';

var SUFFIX_PATTERN = '(?<suffix>\\(?(M|maj|major|m|min|minor|dim|sus|dom|aug)?(\\+|-|add)?\\d*\\)?)';

var BASS_PATTERN = '(\\/(?<bass>[A-G](#|b)?))?';

var MINOR_PATTERN = '(m|min|minor)+';

var CHORD_REGEX = XRegExp("^" + ROOT_PATTERN + SUFFIX_PATTERN + BASS_PATTERN + "$");

接着

console.log(CHORD_REGEX); // will output regexp mentioned at the beginning of the answer

这对我很有效。

于 2019-02-21T20:28:41.977 回答
2

我已经从以前的答案中改进了一些答案,以帮助我的情况。现在它在诗句的开头忽略了一些“可能的和弦”(如A,E)。这就是我出来的:

(\(*[CDEFGAB](?:b|bb)*(?:#|##|sus|maj|min|aug|m|M|°|[0-9])*[\(]?[\d\/]*[\)]?(?:[CDEFGAB](?:b|bb)*(?:#|##|sus|maj|min|aug|m|M|°|[0-9])*[\d\/]*)*\)*)(?=[\s|$])(?! [a-z])
于 2017-03-06T11:55:53.707 回答
0

该代码在我检查的示例中很好地执行了协议,并且 Agreements simplesles 7th agreement with sharp or flat like C# 7

string strRegex = @"^[A-G]([5679bm#]([57])?|1[13]|6\/9|7[-#+b][59]|7?sus[24]|add[249]|aug|dim7?|m\/maj7|m1[13]|m[679]|m7?b5|maj1[13]|maj[79])?([\/][A-G]([5679bm#])?([57])?)?";

Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @"A";
string strReplace = @"[$0]";

return myRegex.Replace(strTargetString, strReplace);
于 2015-03-19T14:47:16.887 回答