Lua:String.match与String.gmatch?

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)
  1. gmatch是否会遍历整个代码(在此示例中为数据)并返回模式为true的所有实例,而match仅是第一个实例?

  2. 在什么情况下一个比另一个更好?

预计到达时间:我在示例代码中添加了页眉和页脚。此页眉和页脚都包含我要使用的变量。现在,整个代码块(页眉/正文/页脚)在我要解析的同一输入文件中重复了很多次。因此模式中存在模式。

Ded*_*tor 5

  1. gmatch是否会遍历整个代码(在此示例中为数据)并返回模式为true的所有实例,而match仅是第一个实例?

    它返回这样做的迭代器。

    返回一个迭代器函数,每次调用该迭代器函数时,都会在字符串s上返回来自模式(请参见第6.4.1节)的下一个捕获。如果pattern未指定捕获,则在每次调用中都会产生整个匹配项。

  2. 在什么情况下一个比另一个更好?

    • string.gmatch 当您只对比赛感兴趣时最好。
    • string.gsub 当您需要替换比赛而不考虑比赛位置时,最好。
    • string.match是用途最广泛的,返回第一个比赛及其位置。成本并未专门用于任何任务,因此需要更多代码。