我有“5.1参考手册”和“Lua编程:第3版”。在我前面。在使用string.match
和string.gmatch
时,阅读这些以及网上的大量搜索仍然让我感到有些困惑。
我知道它们都用于定位模式。
以下是他们在string.gmatch的“参考手册”中使用的示例:
s = "hello world from Lua"
for w in string.gmatch (s, "%a+") do
print(w)
end
据我所知,这会迭代s
中的所有字词,并且每行打印一次。
以下是他们在string.match
中的“Lua编程”一书中使用的示例:
date = "Today is 17/7/1990"
d = string.match(date, "%d+/%d+/%d+")
print(d) -- prints 17/7/1990
我感到困惑的是,何时使用一个而不是另一个?
例如,您需要解析的代码在整个过程中包含了相同的模式数十次。这个模式包含你需要的变量,哪个更好?下面的示例代码(x是所有可变数据,与其他行不同。数据可以是您不关心寻找的任何垃圾,而且只是噪音):
Header contains variable (HERE) and (HERE) I want.
data data data data data data data data
<Font Typeset:xxxx Font Color:xxx Font Xpos:xxx Font Ypos:xxx Font Bold:X Font Uline:X Font Italic:X Font Text:XXXXXXXXX>
data data data data data data data
<Font Typeset:xxxx Font Color:xxx Font Xpos:xxx Font Ypos:xxx Font Bold:X Font Uline:X Font Italic:X Font Text:XXXXXXXXX>
<Font Typeset:xxxx Font Color:xxx Font Xpos:xxx Font Ypos:xxx Font Bold:X Font Uline:X Font Italic:X Font Text:XXXXXXXXX>
<Font Typeset:xxxx Font Color:xxx Font Xpos:xxx Font Ypos:xxx Font Bold:X Font Uline:X Font Italic:X Font Text:XXXXXXXXX>
data data data data data data data data data
<Font Typeset:xxxx Font Color:xxx Font Xpos:xxx Font Ypos:xxx Font Bold:X Font Uline:X Font Italic:X Font Text:XXXXXXXXX>
<Font Typeset:xxxx Font Color:xxx Font Xpos:xxx Font Ypos:xxx Font Bold:X Font Uline:X Font Italic:X Font Text:XXXXXXXXX>
data data data data data data data data data data data data data data data data data data data data data data data data
<Font Typeset:xxxx Font Color:xxx Font Xpos:xxx Font Ypos:xxx Font Bold:X Font Uline:X Font Italic:X Font Text:XXXXXXXXX>
Footer here also has three variables I want (here)/(here) and (here)
这段代码显然有一个模式。但是,如果想创建一个解析数据并抓取变量的简单函数,哪个是更好的选择?
function match(data)
local f_type, f_color, f_xpos, f_ypos, f_bold, f_uline, f_italic, f_txt = data:match("<Font Typeset:(.-) Font Color:(.-) Font Xpos:(.-) Font Ypos:(.-) Font Bold:(.-) Font Uline:(.-) Font Italic:(.-) Font Text:(.-)>
print(f_type, f_color, f_xpos, f_ypos, f_bold, f_uline, f_italic, f_txt)
end
...或...
function gmatch(data)
local f_type, f_color, f_xpos, f_ypos, f_bold, f_uline, f_italic, f_txt = data:gmatch("<Font Typeset:(.-) Font Color:(.-) Font Xpos:(.-) Font Ypos:(.-) Font Bold:(.-) Font Uline:(.-) Font Italic:(.-) Font Text:(.-)>
print(f_type, f_color, f_xpos, f_ypos, f_bold, f_uline, f_italic, f_txt)
end
gmatch是否只是迭代整个代码(本例中的数据)并返回模式为true的所有实例,其中匹配仅执行第一个?
在哪种情况下哪一种比另一种更好?
ETA:我在示例代码中添加了页眉和页脚。这个页眉和页脚都包含我想要使用的变量。现在整个代码(标题/正文/页脚)在我要解析的同一输入文件中重复多次。所以模式中有模式。
答案 0 :(得分:5)
gmatch是否只是迭代整个代码(本例中的数据)并返回模式为true的所有实例,其中匹配仅执行第一个?
它返回一个迭代器来执行此操作。
返回一个迭代器函数,每次调用它时,都会从字符串s返回模式中的下一个捕获(参见§6.4.1)。如果pattern指定没有捕获,则在每次调用中产生整个匹配。
在哪种情况下哪一种比另一种更好?
string.gmatch
最适合您只对比赛感兴趣。string.gsub
最适合您需要替换比赛而不考虑其位置。string.match
是最多才多艺的,返回第一场比赛及其位置。成本并不专门用于任何任务,因此需要更多代码。