2013-02-27 3 views
0

루아 코드가 포함 된 문자열과 일치 시키려고합니다. 루아 : % b (수정 자 포함)

a = [[workspace.Object["Child"]:remove()]] 

나는 .x 또는 ['x'] 중 하나는 관계없이에 또는 그들 중 얼마나 많은 거기에 어떤 순서의 일치 될 수있는 옵션을 만들려고 해요,이 작업을 수행합니다.

  • 가 어떻게 괄호 사이에 하나의 결합 된 문자/패턴보다 더 일치 않습니다

    몇 문제는 내가으로 실행 한? [abc]a 또는 b 또는 c과 일치하지만 abc은 일치하지 않습니다.

  • %b[]에 수정자를 어떻게 추가합니까? 전의. %b[]+ 일치하는 ['x']['x']['x']
  • 만약 내가 %[.-%] *과 일치 할 수 있다면, 그것은 똑같이 작동합니다.
+0

당신이 당신의'match' 또는'find' 반환은 어떻게할까요? – hjpotter92

+0

나는 아무것도 잡으려고하지 않고, xyz와 x [y] [z]와 x [y] .zw [v] 등의 어떤 조합도 인식 할 수 있기를 기다린다. – Waffle

답변

1

루아는 정규 표현식을 완전히 지원하지 않습니다.
중간 문자열을 사용하여 작업을 단계별로 수행 할 수 있습니다.

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]=] ]) 
+0

[ " ']? 문자열이 괄호 안에 들어있는 경우는 무엇입니까? [[string]], [= [string] =], [====== etc. – Waffle

+0

@Waffle - 'workspace.Object [ [[Child]]]'? –

+0

그렇습니다. [ "Child"] 대신 [[[Child]] 또는 [[= Child] =]]로 작성됩니다. 또 다른 질문 : 어떻게 될까요? 읽을 수 있을까요? [[]]를 보았을까요? 생각 = [Child] = 문자열입니까, 아니면 []를보고 뭔가를 색인해야한다고 생각하고 [= [] =] 문자열 @ – Waffle