【问题标题】:Lua Split String by Root Note and Chord NameLua 按根音和和弦名称拆分字符串
【发布时间】:2018-02-01 06:26:59
【问题描述】:

我需要将很多和弦名称拆分为键和和弦类型:

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")

如果我在 name1 和 name2 中得到 nil 值,那么 root = 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

【问题讨论】:

    标签: string split lua


    【解决方案1】:
    #!/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',它们被标记为可选 (?)。表达式的另一部分获取任何字符 (.*),直到字符串结尾。

    【讨论】:

    • 谢谢,没有和弦名称列表,它只是来自另一个函数chord_name,所以它不会有列表:'local text = [[ name = C name = C# name = Db name = C#maj7b5 name = Cmaj7b5 name = Dbmaj7b5 ]]' 字符串是 chord_name
    • 好的,那么在这种情况下,我相信您最感兴趣的是循环体。只需抓住对您来说更有趣的部分并将它们插入您的脚本中。 OTOH,如果答案对您有用,您可以将其标记为已接受吗? meta.stackexchange.com/questions/5234/…
    • 为什么是%w?应该是%u[A-G]: "([A-G][#b]?)(%S*)"
    • 对,%w 是更广泛的匹配(字母数字),而 [A-G] 仅匹配和弦字母。
    • 谢谢它应该可以完成这项工作,我只是无法弄清楚如何将它与local retval_region, _, region_pos, region_end, region_name, region_index, region_color = reaper.EnumProjectMarkers3(0, region_id) 一起使用,因为它是从函数调用而不是表中获取的,它从 " region_name”,它是 Reaper DAW 中的一个 API。最后一个回复被缩短了,因为我必须记住不要在它发布回复时按 Enter 键换行,除非你在 5 分钟内编辑它,否则你就退出了。
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多