Lua模式匹配:如何提取字符串中首个连续相同字符序列?
解决Lua提取首个连续相同字符序列的问题
首先,你遇到的问题主要是Lua模式匹配的捕获组逻辑导致的,另外如果代码返回nil,大概率是模式里的反向引用写法有误(比如误写成了其他正则语法里的$1,但Lua要使用%1作为反向引用标识)。
先分析你的原代码:
local s = "AAABBC" print(s:match("([A-Z])%1*"))
这个模式的逻辑是:
([A-Z])捕获第一个大写字母(也就是字符串开头的"A")%1*匹配零个或多个和捕获组1相同的字符(也就是后续的"A")
但Lua的match函数有个特性:如果模式里包含捕获组,它会优先返回捕获组的内容,而不是整个匹配的子串。所以这段代码实际会返回单个字符"A",而不是你想要的完整序列"AAA"。如果它返回nil,那可能是你不小心把%1写成了$1(Lua不支持$作为反向引用符号),或者字符串里混入了非预期的字符。
要提取整个连续相同的字符序列,你需要把整个序列包裹在一个捕获组里,正确的写法是:
local s = "AAABBC" local first_sequence = s:match("((.)%2*)") print(first_sequence) -- 输出 "AAA"
这里的逻辑是:
(.)捕获任意单个字符(作为第二个捕获组)%2*匹配零个或多个和第二个捕获组相同的字符- 外层的
((.)%2*)把整个连续序列作为第一个捕获组,match会返回这个捕获组的内容,也就是完整的"AAA"。
这个写法很直观,不管字符串开头是哪种连续字符(比如"BBBAAAC"会返回"BBB"),都能准确提取首个连续相同序列。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

