2014-04-12 4 views
1
function expandVars(tmpl,t) 
     return (tmpl:gsub('%$([%a ][%w ]+)', t)) end 
local sentence = expandVars("The $adj $char1 looks at you and says, $name, you are $result", {adj="glorious", name="Jayant", result="the Overlord", char1="King"}) 
    print(sentence) 

위의 코드는 위의 문장에서 $ name과 $ result에는 작동하지만 $ adj와 $ char1에는 작동하지 않는 것과 같은 변수 이름 뒤에 ','가있는 경우에만 작동합니다 그게 뭐야?lua에서 값을 withgsub로 바꾸는 것

+1

변수 이름에 공백이 허용됩니까? 그렇지 않다면,'% $ (% a % w *)'를 시도하십시오. –

+0

아, 네! 그것은 효과가 있었다. 그러나 [% a] [% w]와 % a % w의 차이점은 무엇입니까? 제발? –

+1

'[% w]는 영숫자 ** 또는 공백 **을 의미합니다. –

답변

3

문제 :

귀하의 패턴 [%a ][%w ]+는 적어도 하나의 문자 나 숫자 또는 공백 문자 또는 공간을 의미한다. 이상형 (

function expandVars(tmpl,t) 
    return string.gsub(tmpl, '%$([%a ][%w ]+)', t) 
end 

local sentence = expandVars(
    "$a1 $b and c $d e f ", 
    {["a1 "]="(match is 'a1 ')", ["b and c "]="(match is 'b and c ')", ["d e f "]="(match is 'd e f ')", } 
) 

(매치는 'A1'임) 인쇄 : 정규식 욕심 때문에, 가능한 한 큰 순서와 일치하도록 시도하며, 경기는 공간을 포함) 'B와 C'(경기는 'DEF')

솔루션입니다 : 테이블에서 키와 일치해야합니다

변수 이름; 당신은 공백과 모든 종류의 문자가있는 키를 받아 들일 수 있습니다. 그러나 사용자가 위와 같이 테이블 키에 []을 사용하도록 강요합니다.

영숫자와 밑줄을 잘 유지하고, 숫자로 시작할 수 없다는 제약 조건이 있습니다. 이것은 당신이 숫자의 (포함 없음) (*보다는 +)의 수에 따라 편지 (%a)를 원하고 [%w_] 강조 일반적으로 의미

function expandVars(tmpl,t) 
    return string.gsub(tmpl, '%$(%a[%w_]*)', t) 
end 

local sentence = expandVars(
    "$a $b1 and c $d_2 e f ", 
    {a="(match is 'a')", b1="(match is 'b1')", d_2="(match is 'd_2')", } 
) 

print(sentence) 

이 인쇄

(match는 'a') (match는 'b1')이고 c (match는 'd_2') ef; 일치하지 않는 항목 : $ _a $ 1a b

선행 밑줄과 선행 숫자가 어떻게 받아 들여지지 않았는지 보여줍니다.

+0

고마워요. –

+1

@Simrankaur Np. 당신이 포인트를 가지고 있기 때문에 '유용하다면 upvote하는 것을 잊지 마라. (단지 당신의 질문에 대한 답뿐만 아니라, 당신이 찾거나 유용하다고 생각하는 대답은 까다 롭다.). – Schollii

+0

나는 그것을하고 싶지만, 나는 의견만을 upvote 할 수 있습니까? 대답이 아니라면 알려주십시오. –

관련 문제