37

私はグーグルで検索しましたが、それがわかりません。そんな単純な機能に思えますが、もちろんLuaにはありません。

Pythonで私はするだろう

string = "cat,dog"
one, two = string.split(",")

そして、1 = cat という 2 つの変数があります。2 = 犬

Luaでこれを行うにはどうすればよいですか!?

4

7 に答える 7

68

これを試して

str = 'cat,dog'
for word in string.gmatch(str, '([^,]+)') do
    print(word)
end

「[^,]」は「カンマ以外のすべて」を意味し、+ 記号は「1 つ以上の文字」を意味します。括弧はキャプチャを作成します (この場合は実際には必要ありません)。

于 2013-10-09T03:57:25.373 に答える
16

この分割関数をページの上部に追加します。

function string:split( inSplitPattern, outResults )
  if not outResults then
    outResults = { }
  end
  local theStart = 1
  local theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart )
  while theSplitStart do
    table.insert( outResults, string.sub( self, theStart, theSplitStart-1 ) )
    theStart = theSplitEnd + 1
    theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart )
  end
  table.insert( outResults, string.sub( self, theStart ) )
  return outResults
end

次に、次のようにします。

local myString = "Flintstone, Fred, 101 Rockledge, Bedrock, 98775, 555-555-1212"

local myTable = myString:split(", ")
for i = 1, #myTable do
   print( myTable[i] ) -- This will give your needed output
end

詳細については、こちらをご覧ください:チュートリアル: Lua String Magic

コーディングを続ける................:)

于 2013-10-09T04:42:24.247 に答える
5

-- C strtok と同様に、区切り文字をもう 1 つ使用して分割します (区切り文字を含まないすべての文字列を検索します)。

function split(source, delimiters)
        local elements = {}
        local pattern = '([^'..delimiters..']+)'
        string.gsub(source, pattern, function(value) elements[#elements + 1] =     value;  end);
        return elements
  end

-- 例: var elements = split("bye# bye, miss$ american@ pie", ",#$@ ") -- "bye" "bye" "miss" "american" "pie" を返す

于 2015-04-07T17:03:20.510 に答える
2

これは私がメディアウィキでそれを行う方法です:

str = "cat,dog"
local result = mw.text.split(str,"%s*,%s*")
-- result[0] will give "cat", result[1] will give "dog"

実際、スペースを気にしない場合は、次を使用できます。

str = "cat,dog"
local result = mw.text.split(str,",")
-- result[0] will give "cat", result[1] will give "dog"

ここで使用される API は、Scribunto MediaWiki 拡張機能で実装されています。ここにsplit()メソッドのリファレンス ドキュメントがあり、ここにそのソース コードがあります。Scribunto の Lua 共通ライブラリの他の多くの機能に依存しているため、実際に MediaWiki を使用している場合、または Scribunto 共通ライブラリのほとんどをインポートする予定がある場合にのみ機能します。

于 2014-04-30T20:02:00.987 に答える
1

LPEGstring.split()で文字列操作を表現できるため、Lua ではのような関数はほとんど不要です。それでも専用の関数が必要な場合は、カスタム スプリッターを派生できるスプリッター ファクトリ (以下のスニペット) を定義するのが便利な方法です。mk_splitter()

local lpeg      = require "lpeg"
local lpegmatch = lpeg.match
local P, C      = lpeg.P, lpeg.C

local mk_splitter = function (pat)
  if not pat then
    return
  end
  pat            = P (pat)
  local nopat    = 1 - pat
  local splitter = (pat + C (nopat^1))^0
  return function (str)
    return lpegmatch (splitter, str)
  end
end

LPEG を使用する利点は、関数が有効な Lua 文字列とパターンの両方を引数として受け入れることです。

これを使用して、文字列を文字で分割する関数を作成する方法を次に示します,

commasplitter = mk_splitter ","

print (commasplitter [[foo, bar, baz, xyzzy,]])
print (commasplitter [[a,b,c,d,e,f,g,h]])
于 2013-10-09T10:21:53.337 に答える