我需要将许多和弦名称分为基调和和弦类型:
name = C
name = C#
name = Db
name = C#maj7b5
name = Cmaj7b5
name = Dbmaj7b5所以根将始终是自己的字母,或者带有#或b,是自己的字母,或者只带有#或b,默认情况下,根需要= maj。
root = C
chord = maj
root = C#
chord = maj
root = Db
chord = maj
root = C#
chord = maj7b5
root = C
chord = maj7b5
root = Db
chord = maj7b5我可以得到根目录的名称:
name1 = string.match(name, "%a#")
name2 = string.match(name, "%ab")
name3 = string.match(name, "%a")如果我在根和name2中得到空值,那么name1 = name3。只需输入和弦名称即可。
编辑:使用:
chord, pos = nil, 0
chord, p = string.match(region_name, "=%s+([^\n]+)()", pos)
if not p then end
pos = p
root, chord = string.match(region_name, "(%w[#b]?)(.*)$")
if not chord or #chord == 0 then chord = "maj" end发布于 2018-01-30 05:53:10
#!/usr/bin/env luajit
local text = [[
name = C
name = C#
name = Db
name = C#maj7b5
name = Cmaj7b5
name = Dbmaj7b5
]]
local chord, pos = nil, 0
while true do
local chord, p = text:match("=%s+([^\n]+)()", pos)
if not p then break end
pos = p
local root, chord = chord:match("(%w[#b]?)(.*)$")
if not chord or #chord == 0 then chord = "maj" end
print(("root = %s"):format(root))
print(("chord = %s"):format(chord))
end解释:
这个问题的难点在于如何找到正确的正则表达式。
在第一个正则表达式上:
text:match("=%s+([^\n]+)()", pos) 您只需获取等号后面的任何内容。正则表达式还会记住匹配的最后一个位置,因此在下一次迭代中,您可以从最后一个位置开始。如果没有匹配,最后一个位置将为零。在这种情况下,程序是存在的。
现在你得到了和弦,你把它分成两个元素:
chord:match("(%w[#b]?)(.*)$")第一部分得到一个字母(%w),然后是标记为可选(?)的字符'#‘或'b’。表达式的另一部分获取字符串末尾之前的任何字符(.*)。
https://stackoverflow.com/questions/48509788
复制相似问题