首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lua按根音符和和弦名称拆分字符串

Lua按根音符和和弦名称拆分字符串
EN

Stack Overflow用户
提问于 2018-01-30 04:53:55
回答 1查看 85关注 0票数 1

我需要将许多和弦名称分为基调和和弦类型:

代码语言:javascript
复制
name = C
name = C#
name = Db
name = C#maj7b5
name = Cmaj7b5
name = Dbmaj7b5

所以根将始终是自己的字母,或者带有#或b,是自己的字母,或者只带有#或b,默认情况下,根需要= maj。

代码语言:javascript
复制
root = C
chord = maj
root = C#
chord = maj
root = Db
chord = maj
root = C#
chord = maj7b5
root = C
chord = maj7b5
root = Db
chord = maj7b5

我可以得到根目录的名称:

代码语言:javascript
复制
name1 = string.match(name, "%a#") 
name2 = string.match(name, "%ab") 
name3 = string.match(name, "%a")

如果我在根和name2中得到空值,那么name1 = name3。只需输入和弦名称即可。

编辑:使用:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-30 05:53:10

代码语言:javascript
复制
#!/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

解释:

这个问题的难点在于如何找到正确的正则表达式。

在第一个正则表达式上:

代码语言:javascript
复制
text:match("=%s+([^\n]+)()", pos) 

您只需获取等号后面的任何内容。正则表达式还会记住匹配的最后一个位置,因此在下一次迭代中,您可以从最后一个位置开始。如果没有匹配,最后一个位置将为零。在这种情况下,程序是存在的。

现在你得到了和弦,你把它分成两个元素:

代码语言:javascript
复制
chord:match("(%w[#b]?)(.*)$")

第一部分得到一个字母(%w),然后是标记为可选(?)的字符'#‘或'b’。表达式的另一部分获取字符串末尾之前的任何字符(.*)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48509788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档