루아에서 스플릿 스트링?
간단한 문자열 분할을 수행해야하지만이 기능이없는 것 같으며 테스트 한 수동 방법이 작동하지 않는 것 같습니다. 어떻게해야합니까?
여기 정말 간단한 해결책이 있습니다. 적어도 포함 캡처 문자열에 gmatch 기능을 사용하여 하나 개 의 문자 아무것도 원하는 구분 이외. 구분 기호는 기본적으로 ** 모든 * 공백 (루아에서 % s)입니다.
function mysplit (inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={}
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
table.insert(t, str)
end
return t
end
.
Lua에서 문자열을 분할하는 경우 string.gmatch () 또는 string.sub () 메서드를 시도해야합니다. 문자열을 분할하려는 인덱스를 알고있는 경우 string.sub () 메소드를 사용하거나 문자열을 구문 분석하여 문자열을 분할 할 위치를 찾으려면 string.gmatch ()를 사용하십시오.
Lua 5.1 Reference Manual의 string.gmatch () 사용 예 :
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
t[k] = v
end
토큰을 반복하고 싶다면 아주 깔끔합니다.
line = "one, two and 3!"
for token in string.gmatch(line, "[^%s]+") do
print(token)
end
산출:
하나,
두
과
삼!
간단한 설명 : "[^ % s] +"패턴은 공백 문자 사이의 비어 있지 않은 모든 문자열과 일치합니다.
문자열에서 패턴 을 string.gmatch
찾는 것처럼 이 함수는 패턴 사이 의 것을 찾습니다 .
function string:split(pat)
pat = pat or '%s+'
local st, g = 1, self:gmatch("()("..pat..")")
local function getter(segs, seps, sep, cap1, ...)
st = sep and seps + #sep
return self:sub(segs, (seps or 0) - 1), cap1 or sep, ...
end
return function() if st then return getter(st, g()) end end
end
기본적으로 공백으로 구분 된 것을 반환합니다.
기능은 다음과 같습니다.
function split(pString, pPattern)
local Table = {} -- NOTE: use {n = 0} in Lua-5.0
local fpat = "(.-)" .. pPattern
local last_end = 1
local s, e, cap = pString:find(fpat, 1)
while s do
if s ~= 1 or cap ~= "" then
table.insert(Table,cap)
end
last_end = e+1
s, e, cap = pString:find(fpat, last_end)
end
if last_end <= #pString then
cap = pString:sub(last_end)
table.insert(Table, cap)
end
return Table
end
다음과 같이 호출하십시오.
list=split(string_to_split,pattern_to_match)
예 :
list=split("1:2:3:4","\:")
자세한 내용은 여기를 참조하십시오 :
http://lua-users.org/wiki/SplitJoin
나는이 짧은 해결책을 좋아한다
function split(s, delimiter)
result = {};
for match in (s..delimiter):gmatch("(.-)"..delimiter) do
table.insert(result, match);
end
return result;
end
고양이를 껍질을 벗기는 방법은 여러 가지가 있으므로 여기에 내 접근 방식이 있습니다.
코드 :
#!/usr/bin/env lua
local content = [=[
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat.
]=]
local function split(str, sep)
local result = {}
local regex = ("([^%s]+)"):format(sep)
for each in str:gmatch(regex) do
table.insert(result, each)
end
return result
end
local lines = split(content, "\n")
for _,line in ipairs(lines) do
print(line)
end
출력 : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
설명 :
The gmatch
function works as an iterator, it fetches all the strings that match regex
. The regex
takes all characters until it finds a separator.
You can use this method:
function string:split(delimiter)
local result = { }
local from = 1
local delim_from, delim_to = string.find( self, delimiter, from )
while delim_from do
table.insert( result, string.sub( self, from , delim_from-1 ) )
from = delim_to + 1
delim_from, delim_to = string.find( self, delimiter, from )
end
table.insert( result, string.sub( self, from ) )
return result
end
delimiter = string.split(stringtodelimite,pattern)
Simply sitting on a delimiter
local str = 'one,two'
local regxEverythingExceptComma = '([^,]+)'
for x in string.gmatch(str, regxEverythingExceptComma) do
print(x)
end
A lot of these answers only accept single-character separators, or don't deal with edge cases well (e.g. empty separators), so I thought I would provide a more definitive solution.
Here are two functions, gsplit
and split
, adapted from the code in the Scribunto MediaWiki extension, which is used on wikis like Wikipedia. The code is licenced under the GPL v2. I have changed the variable names and added comments to make the code a bit easier to understand, and I have also changed the code to use regular Lua string patterns instead of Scribunto's patterns for Unicode strings. The original code has test cases here.
-- gsplit: iterate over substrings in a string separated by a pattern
--
-- Parameters:
-- text (string) - the string to iterate over
-- pattern (string) - the separator pattern
-- plain (boolean) - if true (or truthy), pattern is interpreted as a plain
-- string, not a Lua pattern
--
-- Returns: iterator
--
-- Usage:
-- for substr in gsplit(text, pattern, plain) do
-- doSomething(substr)
-- end
local function gsplit(text, pattern, plain)
local splitStart, length = 1, #text
return function ()
if splitStart then
local sepStart, sepEnd = string.find(text, pattern, splitStart, plain)
local ret
if not sepStart then
ret = string.sub(text, splitStart)
splitStart = nil
elseif sepEnd < sepStart then
-- Empty separator!
ret = string.sub(text, splitStart, sepStart)
if sepStart < length then
splitStart = sepStart + 1
else
splitStart = nil
end
else
ret = sepStart > splitStart and string.sub(text, splitStart, sepStart - 1) or ''
splitStart = sepEnd + 1
end
return ret
end
end
end
-- split: split a string into substrings separated by a pattern.
--
-- Parameters:
-- text (string) - the string to iterate over
-- pattern (string) - the separator pattern
-- plain (boolean) - if true (or truthy), pattern is interpreted as a plain
-- string, not a Lua pattern
--
-- Returns: table (a sequence table containing the substrings)
local function split(text, pattern, plain)
local ret = {}
for match in gsplit(text, pattern, plain) do
table.insert(ret, match)
end
return ret
end
Some examples of the split
function in use:
local function printSequence(t)
print(unpack(t))
end
printSequence(split('foo, bar,baz', ',%s*')) -- foo bar baz
printSequence(split('foo, bar,baz', ',%s*', true)) -- foo, bar,baz
printSequence(split('foo', '')) -- f o o
a way not seen in others
function str_split(str, sep)
if sep == nil then
sep = '%s'
end
local res = {}
local func = function(w)
table.insert(res, w)
end
string.gsub(str, '[^'..sep..']+', func)
return res
end
I used the above examples to craft my own function. But the missing piece for me was automatically escaping magic characters.
Here is my contribution:
function split(text, delim)
-- returns an array of fields based on text and delimiter (one character only)
local result = {}
local magic = "().%+-*?[]^$"
if delim == nil then
delim = "%s"
elseif string.find(delim, magic, 1, true) then
-- escape magic
delim = "%"..delim
end
local pattern = "[^"..delim.."]+"
for w in string.gmatch(text, pattern) do
table.insert(result, w)
end
return result
end
You could use penlight library. This has a function for splitting string using delimiter which outputs list.
It has implemented many of the function that we may need while programming and missing in Lua.
Here is the sample for using it.
>
> stringx = require "pl.stringx"
>
> str = "welcome to the world of lua"
>
> arr = stringx.split(str, " ")
>
> arr
{welcome,to,the,world,of,lua}
>
Depending on the use case, this could be useful. It cuts all text either side of the flags:
b = "This is a string used for testing"
--Removes unwanted text
c = (b:match("a([^/]+)used"))
print (c)
Output:
string
참고URL : https://stackoverflow.com/questions/1426954/split-string-in-lua
'IT' 카테고리의 다른 글
Xcode의“헤더 검색 경로”와“사용자 헤더 검색 경로”는 무엇입니까? (0) | 2020.06.14 |
---|---|
이론과 실제에서 Maven은 무엇을합니까? (0) | 2020.06.14 |
스위프트 2 : 호출이 발생할 수 있지만 '시도'로 표시되지 않고 오류가 처리되지 않습니다. (0) | 2020.06.14 |
ng-repeat의 마지막 요소에 대한 다른 클래스 (0) | 2020.06.13 |
파이썬의 인쇄 기능을 "해킹"할 수 있습니까? (0) | 2020.06.13 |