Exception java.lang.IllegalArgumentException

황제낙엽 2010.01.18 16:58 조회 수 : 137770 추천:134

sitelink1  
sitelink2  
sitelink3  
sitelink4  
sitelink5  
sitelink6  

Exception in thread "main" java.lang.IllegalArgumentException: Illegal group reference
        at java.util.regex.Matcher.appendReplacement(Matcher.java:561)
        at java.util.regex.Matcher.replaceAll(Matcher.java:661)
        at java.lang.String.replaceAll(String.java:1663)



내용 보기

java.lang.IllegalArgumentException: Illegal group reference, replaceAll and dollar signs This weblog is officially about inane things I run into while trying to do my job at work. Let's say you have a String object like this:

String mystring = "Your password: #PASSWORD";

and at runtime you need to replace the value of #PASSWORD with a password that a user typed in. You'd write something like this:

String password = "$Jslwe"
mystring = mystring.replaceAll("#PASSWORD", password);

What would happen? You'd expect that the key #PASSWORD would get replaced with the value of the variable 'password' (which is "$Jslwe") and then you'd move happily on your way to something much more interesting. But no, Java throws you an error:

java.lang.IllegalArgumentException: Illegal group reference

which is extremely helpful. Turns out that the second argument to the String replaceAll method "may" have some issues with dollar signs and backslashes which you only find out about if you dig into the Matcher class that backs the replaceAll method or if you're lucky and you read about the whole thing on a site devoted to regular expressions. In short:


myString.replaceAll("regex", "replacement") replaces all regex matches inside the string with the replacement string you specified. No surprises here. All parts of the string that match the regex are replaced. You can use the contents of capturing parentheses in the replacement text via $1, $2, $3, etc. $0 (dollar zero) inserts the entire regex match. $12 is replaced with the 12th backreference if it exists, or with the 1st backreference followed by the literal "2" if there are less than 12 backreferences. If there are 12 or more backreferences, it is not possible to insert the first backreference immediately followed by the literal "2" in the replacement text.

In the replacement text, a dollar sign not followed by a digit causes an IllegalArgumentException to be thrown. If there are less than 9 backreferences, a dollar sign followed by a digit greater than the number of backreferences throws an IndexOutOfBoundsException. So be careful if the replacement string is a user-specified string. To insert a dollar sign as literal text, use $ in the replacement text. When coding the replacement text as a literal string in your source code, remember that the backslash itself must be escaped too: $.

String.replaceAll() 의 두번째 인자값(문자열)에 '$' 가 존재하면 발생하는 Exception 이다.

replaceAll() 하기 전에 두번째 문자열을 다음과 같이 강제로 처리해 준다.

str.replaceAll("$", "\$");

번호 제목 글쓴이 날짜 조회 수
186 Class.getResource() 와 ClassLoader.getResource()의 차이점 황제낙엽 2010.06.25 732
185 Designing RMI Applications 황제낙엽 2010.06.24 3039
184 Java Node to String Conversion 황제낙엽 2010.06.10 670
183 Java SE 6 Mustang 5장 스크립팅 기능 (번역중) 황제낙엽 2010.06.10 662
182 Java6 에서 지원하는 Scripting (번역중) 황제낙엽 2010.05.28 722
181 RMI 시작하기(2) file 황제낙엽 2010.05.27 732
180 RMI 시작하기(1) file 황제낙엽 2010.05.27 670
179 Java Remote Method Invocation (Java RMI) 황제낙엽 2010.05.27 638
178 javax.script API 관련 스크랩 (ScriptEngine, ScriptEngineManager) 황제낙엽 2010.05.25 670
177 java.util.Properties 파일 사용 예제 file 황제낙엽 2010.04.06 642
176 10진수 <-> 16진수(Hex) 변환 file 황제낙엽 2010.03.29 1786
175 ServletConfig 이용하기 황제낙엽 2010.03.15 667
174 16비트 CRC 체크용 클래스 (사용자 클래스) 황제낙엽 2010.03.14 980
173 파일을 읽어서 CRC 값을 연산하는 메서드 (java.util.zip.CRC32) 황제낙엽 2010.03.14 777
172 byte배열에 대한 CRC 를 계산하는 메서드 (java.util.zip.CRC32) 황제낙엽 2010.03.14 2838
171 java의 List와 반복문(loop), 그리고 변수 선언 위치에 대해서 황제낙엽 2010.02.17 1178
170 메모리 유출과 약한 참조 황제낙엽 2010.01.26 1104
169 Methods of the Matcher Class 황제낙엽 2010.01.19 792
168 Pattern.matches() , Matcher.matches() , Matcher.find() file 황제낙엽 2010.01.19 918
» java.lang.IllegalArgumentException 황제낙엽 2010.01.18 137770