メインコンテンツまでスキップ

区切り文字の規則に従って文字列を分割する (string.split)

宣言

分割済みテキスト配列 = string.split(分割対象テキスト, 区切り文字)

引数

  • 分割対象テキスト
    テキスト型。分割する文字列
  • 区切り文字
    テキスト型。区切り文字

戻り値

  • 分割済みテキスト配列
    テーブル型。分割された文字列の各部分が順番に格納されます

説明

区切り文字の規則に従って文字列を分割します
キーワード:文字列の分割、テキストの分割、テキストの切り分け、テキストの区分

使用例

-- 例   1 (アカウントとパスワードを分割):
t = string.split('lfue6841214----123456', '----')
sys.alert('账号是:'..t[1])
--
-- 例 2 (テキストの中間部分、二つの # の間にある文字を取得):
t = string.split('您好,验证码是#4937#,15分钟内有效。【爆炸科技】', '#')
sys.alert('验证码是:'..t[2])
--
-- 例 3 (より複雑なテキストの中間部分を取得):
t = string.split('您好,验证码是4937,15分钟内有效。【爆炸科技】', '验证码是')
t = string.split(t[2], ',15分钟')
sys.alert('验证码是:'..t[1])

:上記のコードでは、この章で扱っていない関数 sys.alert を使用しています

ラッパーの使用例 1

-- テキストの中間部分を取得するラッパー (一致が見つからない場合は nil を返す) 
function str_middle(str, sep1, sep2)
assert(type(str) == 'string', '`str_middle` 第 #1 参数必须是字符串')
assert(type(sep1) == 'string', '`str_middle` 第 #2 参数必须是字符串')
assert(type(sep2) == 'nil' or type(sep2) == 'string', '`str_middle` 第 #3 参数可选,但必须是字符串')
local t = string.split(str, sep1)
if not sep2 or sep1==sep2 then
return t[2]
else
if t[2] == nil then
return nil
else
t = string.split(t[2], sep2)
if t[2] == nil then
return nil
else
return t[1]
end
end
end
end
-- 上記のラッパーはスクリプトにコピーして使用できます
--
r = str_middle('您好,验证码是4937,15分钟内有效。【爆炸科技】', '码是', ',15分')
sys.alert('验证码是:'..r)
-- 出力 "验证码是:4937"
--
r = str_middle('您好,验证码是#8346#,15分钟内有效。【爆炸科技】', '#')
sys.alert('验证码是:'..r)
-- 出力 "验证码是:8346"

:上記のコードでは、この章で扱っていない関数 sys.alert を使用しています

ラッパーの使用例 2

-- 絶対パスからファイル名を取得
function str_strip_dirname(path)
local d = string.split(path, '/')
return d[#d]
end

-- 絶対パスからディレクトリを取得
function str_strip_filename(path)
local d = string.split(path, '/')
d[#d] = nil
return table.concat(d, '/')
end

-- パスの最後の部分から拡張子(サフィックス)を削除
function str_strip_extension(path)
local d = string.split(path, '/')
local fnt = string.split(d[#d], '.')
d[#d] = fnt[1]
return table.concat(d, '/')
end

-- パスの最後の部分から拡張子(サフィックス)を取得
function str_get_extension(path)
local d = string.split(path, '/')
local fnt = string.split(d[#d], '.')
table.remove(fnt, 1)
return table.concat(fnt, '.')
end

sys.alert(str_strip_dirname("/private/var/mobile/Media/1ferver/lua/scripts/1.lua.xxt"))
-- 出力 "1.lua.xxt"

sys.alert(str_strip_filename("/private/var/mobile/Media/1ferver/lua/scripts/1.lua.xxt"))
-- 出力 "/private/var/mobile/Media/1ferver/lua/scripts"

sys.alert(str_strip_extension("/private/var/mobile/Media/1ferver/lua/scripts/1.lua.xxt"))
-- 出力 "/private/var/mobile/Media/1ferver/lua/scripts/1"

sys.alert(str_get_extension("/private/var/mobile/Media/1ferver/lua/scripts/1.lua.xxt"))
-- 出力 "lua.xxt"

sys.alert(str_strip_extension(str_strip_dirname("/private/var/mobile/Media/1ferver/lua/scripts/1.lua.xxt")))
-- 出力 "1"

:上記のコードでは、この章で扱っていない関数 sys.alerttable.concat を使用しています

関連する可能性のある使用例 (中国語と英語が混在するテキストを一文字ずつに分解。UTF8 エンコードのテキストのみ対応)

-- string.split を使用した実装例ではありません
function text_explode(text)
local ret = {}
for p, c in utf8.codes(text) do
ret[#ret + 1] = utf8.char(c)
end
return ret
end
--
local t = text_explode('你好,XXTouch')
sys.alert(table.concat(t, '/')) -- 出力 "你/好/,/X/X/T/o/u/c/h"

:上記のコードでは、この章で扱っていない関数 sys.alerttable.concatutf8.charutf8.codes を使用しています

その他の使用例

この章の末尾にある総合的な使用例を参照してください