1

目前,我正在使用这个功能:

function tokenize( str )
  local ret = {}
  string.gsub( str, "([-%w%p()%[%]®+]+)", function( s ) table.insert( ret, s ) end )
  return ret
end

现在,字符串中可以包含任何字符(从上面的函数中可以清楚地看出)。我想将字符串分解为仅检测空格而不检测其他字符的单词。我已经看到了这里提到的解决方案,但即使在 codepad.org(链接)上也对我没有帮助。我在 PtokaX 工作,如果你想知道的话。我试过使用

print( split( 'foo/bar/baz/test','/' ) )

也是,但这也不起作用。:(

还有其他更简单的方法来创建表吗?

4

2 回答 2

2

为什么不只匹配非空格字符,而不是匹配所有其他字符?

function tokenize( str )
  local ret = {}
  string.gsub( str, "(%S+)", function( s ) table.insert( ret, s ) end )
  return ret
end

如果要使用其他字符进行拆分,模式集否定也很有用:

s='foo#bar!baz*'
s:gsub('([^#!%*]+)',function(s) print(s) end)

另请参阅:Lua 手册中的模式。还要记住 Lua 模式与正则表达式不同,它们更轻,但有其局限性。

于 2012-03-22T13:33:14.430 回答
1

如果您将使用更高级的结构,我推荐LPeg

require"lpeg"
lpeg.locale(lpeg)

local pattern = lpeg.P(
    lpeg.Ct(
        (lpeg.space^0*lpeg.C(-lpeg.space)^1)^0
    )
)

local ret = lpeg.match(pattern, str)

for k,v in ipairs(ret) do
    print(k, v)
end
于 2012-03-23T02:22:41.690 回答