Lua模式匹配 - 相同字符序列

给定s = "AAABBC", 我们能否使用Lua中的模式匹配提取相同字符的第一系列?我期望得到"AAA"。

这是我想的。

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

但它返回了nil。

请帮忙!谢谢。

点赞
用户3832970
用户3832970

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

Egor Skriptunoff提供了一种解决方法,该方法在相同字母组之间在字符串内使用空字符作为临时标记:

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,其中_表示空字符)([演示](https://regex101.com/r/LG8htG/1))
  • gsub("(.)%z%1", "%1") - 将每个字符替换为一个空字符,后跟与该字符相同的字符作为空字符前的一个同样的字符(_AA_AA_AA_BB_BB_CC = > _AAAA_BBB_CC)(请参见 演示
  • match"%z.([A-Z]+)")匹配空字符的第一次出现,然后是任何字符,并在组1中捕获1个或多个大写字母(这就是与string.match一起返回的值)(请参见演示)。
2019-03-31 16:26:44