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 に答える