2016-08-10 4 views
2

은 현재 내가 다음과 같습니다 코드가 경기 전에 문자를 얻을 :루아 패턴 매칭은

somestring = "param=valueZ&456" 
local stringToPrint = (somestring):gsub("(param=)[^&]+", "%1hello", 1) 
StringToPrint는 다음과 같이됩니다

: 나는 & 전에 모든 문자를 교체 한

param=hello&456 

문자열은 "hello"입니다. 이것이 나의 질문이 조금 이상하고 구체적이되는 곳이다.

내 문자열을 param=helloZ&456으로 표시하고 싶습니다. 즉 문자열을 hello으로 바꿔 helloZ으로 바꿀 때 & 앞에 바로 문자를 보존하고 싶습니다. 어떻게 할 수 있습니까?

+0

"param = valueZ & param = 456"'에 대한 예상 출력은 얼마입니까? 아니면 이런 일은 일어나지 않을까요? 'somestring : gsub ("(param =) [^ &] +"("% 1hello % 2", 1)'을 시도해보십시오. http://ideone.com/pHRgAT –

답변

1

내가 제안 :

somestring:gsub("param=[^&]*([^&])", "param=hello%1", 1) 

가 여기에 Lua demo

을 참조 패턴이 일치 :

  • param= - 리터럴 문자열 param=
  • [^&]*-& 0보다 이상의 문자 다른 가능한 한 많이
  • - 그룹 1은 &이 아닌 기호를 캡처합니다 (이전 패턴은 &이 아닌 모든 문자를 가져온 다음 엔진이 한 걸음 뒤로 물러나 그 청크의 마지막 문자를 그룹으로 가져옵니다. 1).
+0

다음과 같이 가정하십시오 :'param = a & xyz '? – hjpotter92

+0

@ WiktorStribiżew 당신의 데모는 작동하지만, 제안은 param 주위에'()'되어있어 작동하지 않습니다. – Rochet2

+0

@ Rochet2 : 여분의 그룹을 삭제하는 것을 잊었습니다. 지금 제거되었습니다. 리터럴 문자열과 일치하면 캡처 오버 헤드를 추가 할 필요가 없다고 생각합니다. –

1

가이 작업을 수행하는 아마 다른 방법이 있지만, 여기에 하나입니다

somestring = "param=valueZ&456" 
local stringToPrint = (somestring):gsub("(param=).-([^&]&)", "%1hello%2", 1) 
print(stringToPrint) 
여기 것은 내가 & 아닌 문자와 &입니다 문자로 끝나는 짧은 문자열과 일치하는 것입니다

. 그런 다음 교체 된 부분에 두 개의 끝 문자를 추가합니다.

+0

고마워요! 궁금한 점이 있다면, 첫 번째'&'문자보다 먼저 (예를 들어'param = valueZ'에서'param = valueZ'로) 문자열을 끝내기 전에 모든 것을 바꾼다면 어떻게할까요? – kshah

+0

@kshah " (param =). + (.) "'? – Rochet2

+0

아, 맞아. 나는 바보 야. 고마워! – kshah