Lua:String.match vs String.gmatch?

Lua: String.match vs String.gmatch?

我面前有《5.1参考手册》和"Programming in Lua: 3rd Ed."。阅读这些以及在网络上进行大量搜索,在使用 string.matchstring.gmatch.

时仍然让我有些困惑

我知道它们都是用来定位模式的。

这是他们在 "Reference Manual" 中用于 string.gmatch 的示例:

s = "hello world from Lua"
for w in string.gmatch (s, "%a+") do
    print(w)
end

我知道这将遍历 s 中的所有单词并每行打印一个单词。

这是他们在 "Programming in Lua" 书中为 string.match 使用的示例:

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
  1. gmatch 是否只是遍历整个代码(本例中的数据)和 return 模式为真的所有实例,其中 match 只执行第一个?

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

ETA:我在示例代码中添加了页眉和页脚。此页眉和页脚都包含我要使用的变量。现在,整个代码块 (header/body/footer) 在我要解析的同一个输入文件中重复了无数次。所以模式中有模式。

  1. Does gmatch just iterate over the entire code (data in this example) and return all instances where the pattern is true where match only does the first?

    它 returns 一个用于这样做的迭代器。

    Returns an iterator function that, each time it is called, returns the next captures from pattern (see §6.4.1) over the string s. If pattern specifies no captures, then the whole match is produced in each call.

  2. In what scenarios is one better than the other?

      当您只对比赛感兴趣时,
    • string.gmatch 是最好的选择。
    • string.gsub 当您需要替换匹配而不考虑它们的位置时最好。
    • string.match 是最通用的,返回第一个匹配项及其位置。成本不是专用于任何任务,因此需要更多代码。