Lua子模式匹配奇怪

时间:2011-08-04 20:21:24

标签: lua pattern-matching

我有两段代码根据模式分解字符串。

第一个:

local test = "whop^1whap^2whup"
local pattern = "%^[12]"
local lastpos = 1

for startpos, endpos in string.gmatch( test, "()"..pattern.."()" ) do


   print("pos: "..startpos..","..endpos)
   print("str: "..string.sub(test,lastpos,startpos-1))
   print("match: "..string.sub(test,startpos,endpos-1))

   lastpos = endpos

end

这个分解了^ 1或^ 2周围的字符串。它输出:

pos: 5,7
str: whop
match: ^1
pos: 11,13
str: whap
match: ^2

第二个版本是:

local test = "whop^t1whap^02whup"
local pattern = "%^[(t1)(02)]"
local lastpos = 1

for startpos, endpos in string.gmatch( test, "()"..pattern.."()" ) do


   print("pos: "..startpos..","..endpos)
   print("str: "..string.sub(test,lastpos,startpos-1))
   print("match: "..string.sub(test,startpos,endpos-1))

   lastpos = endpos

end

这个是支持在^ t1或^ 02分解字符串。相反,我得到了这个:

pos: 5,7
str: whop
match: ^t
pos: 12,14
str: 1whap
match: ^0

我注意到第一个pos(5,7)与第一段代码完全相同,即使模式长度应为3个字符。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

Lua模式不是正则表达式。例如,模式[(t1)(02)]并不意味着“匹配字符串't1'或'02'”。这意味着“匹配字符'(','t','1','0','2'或')'”。 Lua模式中缺少这样的功能使得它们更容易实现(因此使Lua标准库更小)。

你已经达到Lua模式解析能力的极限。如果你需要正则表达式,我建议你下载一个实现它们的Lua模块。