我正在编写一个脚本,该脚本需要找到文本中某些字母(和弦)的匹配项,然后替换它们。
- 但也有一些例外。如果下一个“2”空格为空,则它们是匹配的。
- 如果只有一个空格,但第二个空格也包含一个符合上述规则的字母。
EX(匹配这些 A、Am、B、C#):文本是:
Am BA 飞机降落 C# B
在此示例中,(Am、B、C# 和 B)应该匹配但不是“A”平面。
我对字符串函数和正则表达式不太擅长任何帮助将不胜感激
我基本上是在尝试写一个转置器,但我主要担心的是它会选择错误的文本谢谢
假设您无法控制输入(例如,您从指法网站上抓取这些),并且由于某种原因这些和弦在单词之间交错而不是在行之间休息,那么这是一个开始:
<?php
$mods = '(?:maj|m|min|sus|add9|aug|dim|dom|...)';
$regex = "/\b([ABCDEFG][#b]?$mods?)\s+/"
?>
但是,恐怕我不理解您的“下两个空格”限制。但是,如果您想区分和弦“A”和单词“A”,我建议您不要使用您的方法。相反,请考虑以下替代规则,尽管远非完美。“A”是唯一一个通常单独是一个词的和弦,所以如果你的歌词大写,“A”是一个词而不是和弦的暗示是下一个词是一个未大写的词:
Am B A plane came down C# --> Am B C#
Am B A Plane came down C# --> Am B A C#
如果您考虑一下,除了上下文线索之外,这也是人类可以分辨的方式。要使用此策略制作正则表达式,可以将单独的“A”视为一种特殊情况,如下所示。
<?php
$mods = '(?:maj|m|min|sus|add9|aug|dim|dom|...)';
$regex_1 = '((?:A(?!\s)|[BCDEFG])[#b]?$mods?)';
$regex_2 = '(A(?=\s+[a-z]))';
$regex = "/\b(?:$regex_1|$regex_2)\s+/";
?>
在此处查看正在运行的演示:http ://rubular.com/r/tRjozL7KCx 。
这远非完美,但您可以开始并改进。
更新:解释,帮助学习。
\b A word-boundary, so "A plane came down and CRASHED
into the sea" will not match "D" as a note.
(?: A non-capture group. (Ignore this for now.)
( A capture group. (To encapsulate $regex_1.)
(?: A non-capture group. (Ignore this for now.)
A(?!\s) An "A" not followed by whitespace, i.e. a "lone A".
| An "OR" operator.
[BCDEFG] Any one of these characters, B C D E F G.
)
[#b] Any one of the characters, # b.
? Says the previous entity (# or b) is optional.
$mods Any one of the modifiers, e.g. maj m min ...
? Says the previous entity (maj m min ...) is optional.
)
| An "OR" operator.
( A capture group. (To encapsulate $regex_2.)
A(?=\s+[a-z]) An "A" that is followed by at least one whitespace
character, then a lower-case letter.
)
)
\s+ A bunch of whitespace.
好吧,无论如何这里是转置和弦的课程仍然需要一些调整,但现在它适合我的需要。
它检测几乎所有可能的和弦并拾取内联和弦。如果您包含 Flats 和弦,它将转调为 flats 而不是升号,sharp 也是如此,默认为Sharp,因此 F Transpose by 1 是 F# 而不是 Gb
它还支持 PDF 创建,只需下载DOMPDF并取消注释包含和第 82-86 行并从 $html 变量中删除回显。
希望这会有所帮助,但它仍然远非完美,哈哈,但到目前为止它还没有错过任何和弦
用多首歌曲测试它并发布反馈错误等