Lua标点符号字符串模式(% p)包括哪些字符?

我还没有找到Lua中哪些字符组成了标点符号集“%p”的文档。

原文链接 https://stackoverflow.com/questions/24196137

点赞
stackoverflow用户240443
stackoverflow用户240443

%p 匹配 C 函数 ispunctC source v 5.2),它会匹配以下字符:

041 ‘!’     042 ‘"’       043 ‘#’       044 ‘$’       045 ‘%’
046 ‘&’     047 ‘'’       050 ‘(’       051 ‘)’       052 ‘*’
053 ‘+’     054 ‘,’       055 ‘-’       056 ‘.’       057 ‘/’
072 ‘:’     073 ‘;’       074 ‘<’       075 ‘=’       076 ‘>’
077 ‘?’     100 ‘@’       133 ‘[’       134 ‘\’       135 ‘]’
136 ‘^’     137 ‘_’       140 ‘`’       173 ‘{’       174 ‘|’
175 ‘}’     176 ‘~’

(来自 man ispunct

2014-06-13 00:57:27
stackoverflow用户646619
stackoverflow用户646619

以下是一个小脚本,用来查找它们:

for i=0,255 do
    if string.match(string.char(i), "%p") then
        io.write(string.char(i))
    end
end
io.write("\n")

-- $ luajit test.lua
-- !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
2014-06-13 00:58:31
stackoverflow用户3204551
stackoverflow用户3204551

答案是与语言环境有关的,它是直接接口到 C 函数。

事实上,如果有一个 C 标准函数类似于 Lua 函数,几乎可以肯定 Lua 函数只是将 C 函数封装起来,包括全部的缺陷,甚至不需要看具体情况。(这也是 file:read() 在 5.2 中仍然无法 读取包含零字节的文本的原因,甚至将在 5.3 中也有该问题。)

虽然Amaden已经给出了「C」环境下的好答案,而ColonelThirtyTwo给出了检查当前环境的正确方法,但 C 标准只说:

ispunct(): 函数测试的是任何一种打印字符,这种字符包括在语言环境特定的一个集合中的标点字符,即除了 isspaceisalnum 为 true 外的所有打印字符。在「C」环境下,ispunct 对于为 true 的每个打印字符,其 isspaceisalnum 均为 false。

2014-06-13 01:03:06