문자열 바꾸기 String replace 유틸리티
by 세계의끝 on 11.29, 2009, under AS3.0 API
오늘은 String 클래스의 replace() 메서드를 이용한 간단한 패키지 레벨의 함수를 소개하겠습니다.
코딩하다보면 문자열에 replace() 를 사용해야 할 경우가 많이 있죠. split 과 join 을 사용해 문자열을 바꾸는 방법은 AS2.0 때부터 사용해 오던 방법으로 널리 알려져 있습니다. 그렇지만 AS3.0가 나온 이후로는 훨씬 세련된 문자열 치환 방법인 String 클래스에 replace()메서드를 사용하지 않을 이유가 없죠.
많은 개발자들이 자신만의 문자열 replace 함수를 만들어 사용하거나, 또는 replace 는 간단한 함수이므로 따로 클래스를 만들지 않고 그때그때 코딩해서 사용하기도 합니다.
저의 경우에는 워낙에 사용 빈도가 빈번한 함수라 재사용에 최적화 할 필요가 느껴졌는데요, 저는 이런 방법을 사용했습니다.
0 1 2 3 4 5 6 7 | //replaceString.as 파일의 내용 package kr.ufx.text { public function replaceString( $text:String, $string:String, $replacedString:String, $option:String = "g" ):String { return $text.replace( new RegExp( $string, $option ), $replacedString ); } } |
이 replaceString.as 파일은 클래스가 아니라 replaceString() 함수만 존재하는 파일 입니다.[01]
저는 replaceString() 함수를 kr.ufx.text 패키지 레벨로 빼냈는데요, 이것은 replace() 정도의 간단한 작업을 하기 위해 클래스 객체를 만들필요 없이 곧바로 호출해서 사용하기 위함입니다.
즉, 사용방법은 아래와 같습니다.
0 1 2 3 4 | import kr.ufx.text.replaceString; var str:String = "세계의끝과 하드보일드 원더랜드"; str = replaceString( str, "하드보일드", "플래시" ); trace( str ); // 출력: 세계의끝과 플래시 원더랜드 |
그리고 RegExp 의 option 을 “g” (global) 로 기본값 설정하였기 때문에 while 을 사용할 필요 없이, 모든 문자열을 한번에 치환해줍니다.[02]
이렇게 해서 String 클래스의 replace() 가 API 차원에서 학습 된 후, 재사용이 가능한 형태의 *.as 파일로 만들었습니다.(이 포스트)
다시 이 기능을 확장하여 구체적인 기능을 가진 다른 클래스로 활용되는 과정을 xml 작업에 최적화된 문자열 바꾸기 String replace 클래스 에서 살펴보세요.
- 이 파일에는 클래스 키워드 class 의 클래스 정의나 생성자 함수가 존재하지 않습니다 [↑]
- 이 option 에 대해서 더 자세한 정보는 http://help.adobe.com/ko_KR/AS3LCR/Flash_10.0/RegExp.html#RegExp() 를 참고하세요. [↑]
Blog under the Creative Commons Attribution-NoDerivs 3.0 License
11월 30th, 2009 on am 2:29
음.. 정규표현식을 저렇게 사용하면.. :’)
a.c가 abc를 치환해버리기도 하고, a?c는 c와 ac를 치환하는 등.. 정규식의 문법과 충돌이 많습니다.
그리고 정규식의 경우에는, string.replace(/a.c/g, ”)를 사용하는 방법이 더 명확합니다.
또 이는 다소 논란의 여지가 있으나,
유틸리티 함수는 모듈화를 하여 유틸리티 클래스, 즉 StringUtil.replaceAll() 과 같이 사용하는 것이 조금 더 일반화된 방법인 것 같습니다. :’)
11월 30th, 2009 on pm 1:18
사용성에 치중해서 문자열로 인자를 받으려다 보니 기호를 같이 입력할 경우 문법상의 오류가 생길 수 있다는걸 잊고 있었군요. (게다가 제가 정규식에 익숙하지 않아서 ㅎㅎ)
지적 감사합니다.
아무래도 에러를 없애기 위해서는 정규식 객체를 배열로 받아야겠군요.