본문 바로가기
3Ds Max Script

특정 문자 치환하기

by 대마왕J 2023. 7. 12.
fn replaceAllstring str findstr replaceStr = 
(
	local newString = copy str
	while true do
	(
		if keyboard.escPressed do exit
		f = findString newString findstr
		if f != undefined  then 
			(
			newString = replace newString f findstr.count replaceStr
			)
		else exit
	)
	return newString
)

s = "철수는 엄마와 함께 저녁을 먹었습니다 . 저녁을 먹고 TV를 보면서 철수는 빵과 과자를 먹었습니다. 새벽2시가 되고 철수는 다시 출출해져서 라면을 먹었습니다 아침이 되자 철수는 너무 많이 먹어서 얼굴이 부었습니다 "

newStr = replaceAllstring s "철수" "돌쇠"
messageBox newStr

이러면 일단 마지막 결과로 메시지박스에서 

 

이렇게 나오게 됩니다. 좋은 스크립트 예제네요. 
아쉬운 점이라면 책에 오타가 있다는 점  (덕분에 브레이크포인트로 디버깅해보니 잡을 수 있어 좋았지만) 

자 그럼 차근차근 이걸 설명해 볼까요 

============================================================================

우선 

"
철수는 엄마와 함께 저녁을 먹었습니다 . 
저녁을 먹고 TV를 보면서 철수는 빵과 과자를 먹었습니다. 
새벽2시가 되고 철수는 다시 출출해져서 라면을 먹었습니다 
아침이 되자 철수는 너무 많이 먹어서 얼굴이 부었습니다 

이 텍스트가 준비되어 있어야 합니다. 철수야 왜그랬니. 
철수는 부끄러워서 돌쇠가 그런 것 처럼 조작하려고 합니다. 

그래서 일단 이 스트링 문구를 전부 s 변수에 넣습니다. 

s = "
철수는 엄마와 함께 저녁을 먹었습니다 . 
저녁을 먹고 TV를 보면서 철수는 빵과 과자를 먹었습니다. 
새벽2시가 되고 철수는 다시 출출해져서 라면을 먹었습니다 
아침이 되자 철수는 너무 많이 먹어서 얼굴이 부었습니다 
"

줄바꿈은 신경쓰지 않아도 됩니다. 줄바꿈도 문자니까요 
저 문구가 다 변수 하나에 들어가다니 역시 스크립트는 무서워 호달달달 

 

그 다음은 함수를 하나 만들어 주기로 합시다. 

fn replaceAllstring str findstr replaceStr = 
(
)

fn 은 함수라는 말이고 replaceAllstring이 함수 이름입니다. 
들어가는 인자는 str , findstr, replaceSrt 로 각각, 전체 글, 찾을 글자, 바꿀 글자를 입력받는 거네요 

이제 함수 안에 동작을 만들어 주어야 겠지요. 

fn replaceAllstring str findstr replaceStr = 
(
	local newString = copy str
 )

str 에는 아까 위에서 만든 s 가 들어갈겁니다. 문단 전체가 들어가는거죠. 그리고 그걸 newString이라고 하는 로컬 변수를 만들어, copy로 만들어 넣습니다. 안 그러면 reference 로 들어가게 되어서 , 원본이 바뀌지 않아요 

이제 전체 문구가 newString 안으로 들어갔을테니까, 저 문구를 순회하면서 해당 문구(철수) 가 있는지 판단해서 원하는 문구(돌쇠) 로 바꾸는 코드를 넣어야 합니다. 


s = "
철수는 엄마와 함께 저녁을 먹었습니다 . 
저녁을 먹고 TV를 보면서 철수는 빵과 과자를 먹었습니다. 
새벽2시가 되고 철수는 다시 출출해져서 라면을 먹었습니다 
아침이 되자 철수는 너무 많이 먹어서 얼굴이 부었습니다 
"

fn replaceAllstring str findstr replaceStr = 
(
	local newString = copy str
	while true do
	(
		if keyboard.escPressed do exit
		f = findString newString findstr
	)
)

while do 문이 나왔습니다. 조건에 맞으면 저 안을 뺑뺑이 도는 건데, 조건을 true 라고 해 놨습니다. 
즉 무한히 뺑뺑이 돈다는 이야기... 저거 무한루프라 이대로 실행하면 강제종료밖에 방법이 없습니다. 

그래서 안전장치로 코드를 넣어놨죠 

if keyboard.escPressed do exit

로, esc 키가 눌리면 탈출하도록 해놨습니다. 

그리고 f 라는 변수를 만들고, findString 이라는 명령으로 , 바로 위에서 카피한 문장 전체인 newString 에서 findstr 글씨(철수) 가 있냐를 찾는 거죠  즉 f 에는  "철수" 라는 글자가 나오는 위치를 가지고 있습니다. 

이게 Debug() 로 저 f 변수에 들어가는 값을 추적해 보면, 처음에는 1이 나오고, 이후에는 30몇인가 나오고 .. 뭐 그렇습니다. 말그대로 '철수라는 글자가 있는 위치' 를 표현해 주는 것입니다. 그것도 첫 번째 나오는 곳만 파악하죠. 두 번째는 뭐 안중에 없습니다. 만약 철수라는 글자가 없으면 undefine 되는 것이구요 (위치는 1부터 시작합니다) 

이제 이 다음에는 철수라는 글자가 있는 첫 번째 위치를 찾았으니, 이 글자를 바꿔줄 수 있도록 해야 합니다. 

s = "
철수는 엄마와 함께 저녁을 먹었습니다 . 
저녁을 먹고 TV를 보면서 철수는 빵과 과자를 먹었습니다. 
새벽2시가 되고 철수는 다시 출출해져서 라면을 먹었습니다 
아침이 되자 철수는 너무 많이 먹어서 얼굴이 부었습니다 
"

fn replaceAllstring str findstr replaceStr = 
(
	local newString = copy str
	while true do
	(
		if keyboard.escPressed do exit
		f = findString newString findstr
		if f != undefined  then 
			(
			newString = replace newString f findstr.count replaceStr
			)
		else exit
	)
	return newString 
)

if 문이 등장했습니다. f != undefined  , 즉  f 가 정의되지 않지 않았다면! 다시 말해 f에 정상적인 값이 들어 있다면! 이라는 뜻이죠 . 위에서 findString을 하다가 철수가 없으면 f에 언디파인드 값이 들어올테니. 철수가 있다면 제대로 되는 것입니다. 

그래서 if 문이 가동되면 이번엔 replace 함수가 나옵니다. 

replace 함수는 
replace  <처리해서저장할녀석>  <어디서부터시작할건지위치> <얼마까지할건지위치> <뭘로바꿀건지> 
라는 식으로 사용합니다.  

봅시다.. 처리해서 저장할 녀석은 newString이라는 변수죠. 원본 s 문구가 카피되어 저장된 녀석. 
그리고 어디서부터 시작할지에 대한 데이터는 f 에 들어 있습니다. 방금 철수를 찾았으니. 
그리고 어디까지 할 건지에 대한 위치값 (글자 숫자) 는 findstr 의 글자수와 같을테니 findstr.count 가 됩니다. 
그리고 마지막으로 뭘로 바꿀건지는 replaceStr 에 들어 있는 글자죠. 

이게 한 번 돌면 첫 번째 철수를 바꿀겁니다. 즉 while을 주석처리하면 맨 앞 철수만 바뀌는거죠. 

 그리고 철수를 다 찾아서 f 값이 언디파인 되면 exit 되게 해 놨습니다. 

마지막으로 newString을 리턴하면 되고요 

 

이제 함수가 완성되었으니 함수를 실행하는 부분까지 만들어 보죠 

fn replaceAllstring str findstr replaceStr = 
(
	local newString = copy str
	while true do
	(
		if keyboard.escPressed do exit
		f = findString newString findstr
		if f != undefined  then 
			(
			newString = replace newString f findstr.count replaceStr
				)
		else exit
	)
	return newString
)

s = "철수는 엄마와 함께 저녁을 먹었습니다 
저녁을 먹고 TV 보면서 철수는 빵과 과자를 먹었습니다 
새벽 2시가 되어서 철수는 다시 출출해져서 라면을 먹었습니다 
아침에 일어나자 철수는 너무 많이 먹어서 얼굴이 부었습니다"

newStr = replaceAllstring s "철수" "돌쇠"
messageBox newStr

사실상 이 함수의 입력값은 <전체 문구> <찾을 글자> <바꿀글자> 가 되므로 

newStr = replaceAllstring s "철수" "돌쇠"

가 됩니다. 

그럼 while 문으로 돌면서 모든 철수를 돌쇠로 바꾸겠지요. 

다 되고 나면 messageBox로 newStr을 보여주면 되는 것입니다. 

반응형

댓글