3

回答这个问题时,我编写了这段代码来遍历字符串中的 UTF-8 字节序列:

local str = "KORYTNAČKA"
for c in str:gmatch("[\0-\x7F\xC2-\xF4][\x80-\xBF]*") do 
    print(c) 
end

它在 Lua 5.2 中工作,但是在 Lua 5.1 中,它报告了一个错误:

格式错误的模式(缺少']')

\xhh我记得在 Lua 5.1 中,不支持字符串文字,所以我将其修改为:

local str = "KORYTNAČKA"
for c in str:gmatch("[\0-\127\194-\244][\128-\191]*") do 
    print(c) 
end

但是错误还是一样,怎么解决呢?

4

2 回答 2

3

我高度怀疑,这是因为\0在模式中发生的。基本上,保存你的模式的字符串在它应该之前就终止了,事实上,lua 正则表达式引擎正在解析的是[\0:这显然是错误的模式,应该会触发您当前遇到的错误。

为了证明这个概念,我对模式做了一点改动:

local str = "KORYTNAČKA"
for c in str:gmatch("[\x0-\x7F\xC2-\xF4][\x80-\xBF]*") do 
    print(c) 
end

在 lua 5.1.4 上按预期编译和运行。示范

注意:我实际上并没有查看模式在做什么。\0刚刚通过添加删除x。所以修改后的代码的输出可能不是你所期望的。

编辑:作为一种解决方法,您可以考虑在您的第二个代码示例中替换\0\\0(to escape null-termination):

local str = "KORYTNAČKA"
for c in str:gmatch("[\\0-\127\194-\244][\128-\191]*") do 
    print(c) 
end

演示

于 2014-04-09T08:10:08.400 回答
3

请参阅有关模式的 Lua 5.1 手册。

A pattern cannot contain embedded zeros. Use %z instead.

在 Lua 5.2 中,这已更改为您可以使用它\0,但在 5.1 中并非如此。只需添加%z到第一组并将第一个范围更改为\1-\127.

于 2014-04-09T12:22:42.330 回答