루아는 정규 표현식을 완전히 지원하지 않습니다.
중간 문자열을 사용하여 작업을 단계별로 수행 할 수 있습니다.
local str0 = [[workspace.Object["Child"]['xx'][5].xxx:remove()]]
local str = str0
:gsub('%b[]',
function(s)
return s:gsub('^%[%s*([\'"]?)(.*)%1%s*%]$','{%2}')
end
)
:gsub('[%.:]%s*([%w_]+)','{%1}')
print(str0)
print(str)
print()
for w in str:gmatch'{(.-)}' do
print(w)
end
---------------------------
-- output
---------------------------
workspace.Object["Child"]['xx'][5].xxx:remove()
workspace{Object}{Child}{xx}{5}{xxx}{remove}()
Object
Child
xx
5
xxx
remove
편집 :
local str0 = [[workspace.Object["Child"]['xx'][5][ [=[xxx]=] ]:remove()]]
local str = str0
:gsub('%b[]',
function(s)
return s:gsub('^%[%s*([\'"]?).*%1%s*%]$','{%0}')
end
)
:gsub('%.%s*[%w_]+','{%0}')
:gsub(':%s*[%w_]+%s*([\'"]).-%1','{%0}')
:gsub(':%s*[%w_]+%s*%b()','{%0}')
:gsub('{(:%s*remove%s*%(%s*%))}','%1')
:gsub('}%s*{', '')
:gsub('([%w_]+)%s*(%b{})%s*:%s*remove%s*%(%s*%)',
function(s1, s2)
return 'removefilter('..s1..s2:match'^{(.*)}$'..')'
end
)
:gsub('([%w_]+)%s*:%s*remove%s*%(%s*%)','removefilter(%1)')
:gsub('[{}]', '')
print(str0)
print(str)
---------------------------
-- output
---------------------------
workspace.Object["Child"]['xx'][5][ [=[xxx]=] ]:remove()
removefilter(workspace.Object["Child"]['xx'][5][ [=[xxx]=] ])
당신이 당신의'match' 또는'find' 반환은 어떻게할까요? – hjpotter92
나는 아무것도 잡으려고하지 않고, xyz와 x [y] [z]와 x [y] .zw [v] 등의 어떤 조합도 인식 할 수 있기를 기다린다. – Waffle