Lua:String.match vs String.gmatch?

时间:2015-02-18 20:34:19

标签: string lua string-matching

我有“5.1参考手册”和“Lua编程:第3版”。在我前面。在使用string.matchstring.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
  1. gmatch是否只是迭代整个代码(本例中的数据)并返回模式为true的所有实例,其中匹配仅执行第一个?

  2. 在哪种情况下哪一种比另一种更好?

  3. ETA:我在示例代码中添加了页眉和页脚。这个页眉和页脚都包含我想要使用的变量。现在整个代码(标题/正文/页脚)在我要解析的同一输入文件中重复多次。所以模式中有模式。

1 个答案:

答案 0 :(得分:5)

  1.   

    gmatch是否只是迭代整个代码(本例中的数据)并返回模式为true的所有实例,其中匹配仅执行第一个?

    它返回一个迭代器来执行此操作。

      

    返回一个迭代器函数,每次调用它时,都会从字符串s返回模式中的下一个捕获(参见§6.4.1)。如果pattern指定没有捕获,则在每次调用中产生整个匹配。

  2.   

    在哪种情况下哪一种比另一种更好?

    • string.gmatch最适合您只对比赛感兴趣。
    • string.gsub最适合您需要替换比赛而不考虑其位置。
    • string.match是最多才多艺的,返回第一场比赛及其位置。成本并不专门用于任何任务,因此需要更多代码。