Pwr*_*r87 4 string lua string-matching
我同时拥有“ 5.1参考手册”和“在Lua中编程:第三版”。在我前面。阅读这些内容以及网络上的大量搜索内容,在使用string.match
和时仍然让我有些困惑string.gmatch
。
我知道它们都用于定位模式。
这是他们在“参考手册”中用于string.gmatch的示例:
s = "hello world from Lua"
for w in string.gmatch (s, "%a+") do
print(w)
end
Run Code Online (Sandbox Code Playgroud)
我知道这将遍历所有单词s
并每行打印一个单词。
这是他们在“ Lua编程”一书中使用的示例string.match
:
date = "Today is 17/7/1990"
d = string.match(date, "%d+/%d+/%d+")
print(d) -- prints 17/7/1990
Run Code Online (Sandbox Code Playgroud)
我感到困惑的是,什么时候应该适当使用一个?
例如,您有要解析的代码,其中包含数十遍相同的模式。此模式包含您需要的变量,哪个是更好的选择?下面的示例代码(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)
Run Code Online (Sandbox Code Playgroud)
这段代码显然具有某种模式。但是,如果要创建一个简单的函数来解析数据并获取变量,哪个更好?
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
Run Code Online (Sandbox Code Playgroud)
...要么...
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
Run Code Online (Sandbox Code Playgroud)
gmatch是否会遍历整个代码(在此示例中为数据)并返回模式为true的所有实例,而match仅是第一个实例?
在什么情况下一个比另一个更好?
预计到达时间:我在示例代码中添加了页眉和页脚。此页眉和页脚都包含我要使用的变量。现在,整个代码块(页眉/正文/页脚)在我要解析的同一输入文件中重复了很多次。因此模式中存在模式。
gmatch是否会遍历整个代码(在此示例中为数据)并返回模式为true的所有实例,而match仅是第一个实例?
它返回这样做的迭代器。
返回一个迭代器函数,每次调用该迭代器函数时,都会在字符串s上返回来自模式(请参见第6.4.1节)的下一个捕获。如果pattern未指定捕获,则在每次调用中都会产生整个匹配项。
在什么情况下一个比另一个更好?
string.gmatch
当您只对比赛感兴趣时最好。string.gsub
当您需要替换比赛而不考虑比赛位置时,最好。string.match
是用途最广泛的,返回第一个比赛及其位置。成本并未专门用于任何任务,因此需要更多代码。