Lua模式匹配 - 相同字符的系列

时间:2018-01-31 12:02:00

标签: lua pattern-matching

鉴于s =" AAABBC", 我们可以使用Lua中的模式匹配来提取第一个相同字符的系列吗? " AAA"是我期待得到的。

这就是我的想法。

local s = "AAABBC"
print(s:match("([A-Z])%1*"))

但它返回零。

请帮忙!感谢。

1 个答案:

答案 0 :(得分:0)

不支持Lua模式中的模式内反向引用,您可能要使用一些支持这些结构的外部正则表达式库,例如PCRE。

Egor Skriptunoff suggests a work around使用空字符作为相同字母组之间的字符串内的临时标记:

s:gsub("[A-Z]", "\0%0%0"):gsub("(.)%z%1", "%1"):match"%z.([A-Z]+)"

对于AAABBC字符串,Egor的解决方案执行以下操作:

  • gsub("[A-Z]", "\0%0%0")-将每个大写字母加倍,在每个序列之前插入一个空值(AAABBC,其中_AA_AA_AA_BB_BB_CC代表一个空字符)(demo
  • _-用一个空字符替换每个字符,后跟与该空字符之前完全相同的字符(gsub("(.)%z%1", "%1") => _AA_AA_AA_BB_BB_CC)(请参见demo
  • _AAAA_BBB_CC匹配第一个出现的null字符,然后匹配任何字符,然后捕获任意1个以上大写字母的组1(即用match"%z.([A-Z]+)")返回的值)(请参见{{ 3}})。