반응형

https://myhappyman.tistory.com/244

 

JAVA - replaceFirst 치환시 주의점(특수문자 문자열 치환)

$user_id 형태로 되어있는부분을 찾아서 해당하는 특정값 'admin' 형태로 치환하는 특정 로직을 구성했는데 replace가 replaceAll처럼 뒷부분까지 동작하는 현상을 발견하였습니다. 😥 replace 정규식으로

myhappyman.tistory.com

 

이전에도  replaceFirst를 사용하여 문서를 읽으면서 차례대로 치환처리를 해주는 서비스를 개발했었는데, 관련하여 최근에 또 이슈가 발생하였다.

 

java.lang.IllegalArgumentException: Illegal group reference 해당 오류가 발생하고 있었는데, 로그부분의 관련된 서비스 로직부분을 보니 이번에도 replace부분이였다.

 

프론트에서 입력한 파라미터값을 가져와서 html을 만드는 서비스였는데, 특정 위치에 치환을 위해 replaceFirst부분을 사용하였고, 입력한 파라미터값에 '$', '\' 값이 존재하면 해당 오류가 발생하고 있었다.

 

자바 정규식에 특수문자 몇 키워드는 특별한 동작을 하도록 설계가 되어있어서 해당 현상이 발생한다.

이외에도 '+', '*', '?', '^' 등의 키워드가 정규식내에서 특정 키워드로 동작을 하는데, 이런 동작을 하지 않도록 처리할 수 있다.

 

java.util.regex.Matcher.quoteReplacement 메소드를 사용하면 되는데, 기존에 파라미터 처리하던 부분을 아래와 같이 수정하여 해결하였다.

 

기존 문제 발생

reportForm = reportForm.replaceFirst("[$]user_name",  param.get("user_name"))


수정 후

reportForm = reportForm.replaceFirst(
				"[$]user_name",  
				java.util.regex.Matcher.quoteReplacement(param.get("user_name"))
             )

 

반응형