[[solved] lua匹配字符串中标记后的所有内容

问题描述 投票:0回答:2

字符串是这样的:TEMPLATES =“!$ TEMPLATE templatename制造商模型模式\ n $ TEMPLATE MacQuantum Wash Basic \ n $$ MANUFACTURER Martin \ n $$ MODELNAME Mac Quantum Wash \ n $$ MODENAME Basic \ n”

我获取不带标签的字符串的方法是:

    local sentence=""
    for word in string.gmatch(line,"%S+") do
      if word ~= tag then
        sentence=sentence .. word.." "
      end              
    end
    table.insert(tagValues, sentence)
    E(tag .." --> "..sentence)

我得到输出:

$$MANUFACTURER --> Martin 
$$MODELNAME --> Mac Quantum Wash 
... 
...

但是这不是我喜欢的方式。我想首先找到以$ TEMPLATE标记开头的块,以检查这是否是正确的块。我逐行读取的文件中有很多这样的块。然后,我必须获取所有标记有双$的标签:$$ MODELNAME等。我已经尝试了很多方法,但是没有一个让我满意。也许有人知道如何解决?

lua string-matching findinfiles
2个回答
1
投票

我们将在函数string.gmatch中使用Lua patterns(类似于regex,但有所不同),该函数将创建一个循环。说明:for match in string.gmatch(string, pattern) do print(match) end是一个迭代函数,它将对pattern中的string的每个实例进行迭代。我将使用的模式是%$+%w+%s[^\n]+

%$+-至少1个文字$($是一个特殊字符,因此它需要%进行转义),+表示1或更大。如果您只需要标记的数据,但您只需要匹配一个(“%$”),但是我们需要有关多少美元的信息,因此我们将其保留。

[%w+-匹配任何字母数字字符,与连续显示的字符数相同。

[%s-匹配一个空格字符

[^\n]+-匹配不等于'\ n'的任何内容(^表示取反),与连续显示的内容相同。一旦函数击中\ n,它将在比赛中执行循环并重复该过程。

[这给我们留下了“ $ TEMPLATE templatename producer”这样的字符串。我们希望将$ TEMPLATE提取到其自己的变量中进行验证,因此我们使用string.match(string, pattern)仅返回字符串中模式所找到的值。

确定:编辑:这是一个全面的示例,应该提供您想要的一切。

templates = "!$TEMPLATE templatename manufacturer model mode\n$TEMPLATE MacQuantum Wash Basic\n$$MANUFACTURER Martin\n$$MODELNAME Mac Quantum Wash\n$$MODENAME Basic\n"

local data = {}
for match in string.gmatch(templates, "%$+%w+%s[^\n]+") do --finds the pattern given in the variable 'templates'
  --this function assigns certain data to tags inside table t, which goes inside data.
 local t = {}
 t.tag = string.match(match, '%w+')  --the tag (stuff that comes between a $ and a space)
 t.info = string.gsub(match, '%$+%w+%s', "") --value of the tag (stuff that comes after the `$TEMPLATE `. Explanation: %$+ one or more dollar signs $w+ one or more alphanumeric characters $s a space. Replace with "" (erase it)
 _, t.ds = string.gsub(match, '%$', "") --This function emits two values, the first one is garbage and we don't need (hence a blank variable, _). The second is the number of $s in the string).
 table.insert(data, t)
end
for _,tag in pairs(data) do     --iterate over every table of data in data.
 for key, value in pairs(tag) do
  print("Key:", key, "Value:", value) --this will show you data examples (see output)
 end
 print("-------------")
end

print('--just print the stuff with two dollar signs')
for key, data in pairs(data) do
 if data.ds == 2 then --'data' becomes a subtable in table 'data', we evaluate how many dollar signs it recognized.
  print(data.tag)
 end
end

print("--just print the MODELNAME tag's value")
for key, data in pairs(data) do
 if data.tag == "MODELNAME" then --evaluate the tag name.
  print(data.info)
 end
end

输出:

Key:    info    Value:  templatename manufacturer model mode
Key:    ds  Value:  1
Key:    tag Value:  TEMPLATE
-------------
Key:    info    Value:  MacQuantum Wash Basic
Key:    ds  Value:  1
Key:    tag Value:  TEMPLATE
-------------
Key:    info    Value:  Martin
Key:    ds  Value:  2
Key:    tag Value:  MANUFACTURER
-------------
Key:    info    Value:  Mac Quantum Wash
Key:    ds  Value:  2
Key:    tag Value:  MODELNAME
-------------
Key:    info    Value:  Basic
Key:    ds  Value:  2
Key:    tag Value:  MODENAME
-------------
--just print the stuff with two dollar signs
MANUFACTURER
MODELNAME
MODENAME
--just print the MODELNAME tag's value:
Mac Quantum Wash

0
投票

非常感谢。我花了三天时间寻找正确的正则表达式模式,但没有结果。您的帮助解决了我的问题。 :)

© www.soinside.com 2019 - 2024. All rights reserved.