java.util.regex.pattern.compile()
메소드는 상당한 비용이 드는 작업이므로 현명하게 사용해야 합니다.
이 방법은 더욱이 Regex
을 사용하여 패턴 일치를 수행하는 데 필요한, Pattern
클래스의 인스턴스를 만드는 데 사용할 수 있는 유일한 방법입니다.
불행하게도 String.matches()
이나 String.split()
같은 편리한 메소드들도 실제론 이러한 메소드 호출이 숨겨져 있을 수 있습니다.
그래서 별 이유도 없이 큰 비용을 감수해야하는 Regex
컴파일 작업을 반복하는 실수를 범하기 쉽습니다.
이 규칙은 다음과 같은 경우에 문제가 발생합니다:
-
Pattern
에 사용되는String
이 고정되있거나 상수이지만, final static으로 생성되지 않은 경우. -
String.matches
,String.split
,String.replaceAll
,String.replaceFirst
에 사용되는String
이 고정되있거나 상수인 경우. 이 경우java.util.regex.Pattern
을 사용하도록 코드를 리팩터링해야 합니다.
규칙을 어긴 코드
public void doingSomething(String stringToMatch) {
Pattern regex = Pattern.compile("myRegex"); // 규칙을 어긴 코드
Matcher matcher = regex.matcher("s");
// ...
if (stringToMatch.matches("myRegex2")) { // 규칙을 어긴 코드
// ...
}
}
규칙을 준수한 해결책
private static final Pattern myRegex = Pattern.compile("myRegex");
private static final Pattern myRegex2 = Pattern.compile("myRegex2");
public void doingSomething(String stringToMatch) {
Matcher matcher = myRegex.matcher("s");
// ...
if (myRegex2.matcher(stringToMatch).matches()) {
// ...
}
}
예외
string.split
을 사용하면서 인수로 전달된 string
이 다음 두 조건 중 하나를 만족할 경우에는 정규식을 만들지 않습니다.
- 문자 길이가 1이면서
RegEx
의 메타 문자 중 하나가 아닌 경우.".$|()[{^?\*+\"
- 문자 길이가 2인데, 첫 번째 문자는 백슬래시이고 두 번째 문자는 ASCII 숫자나 ASCII 문자가 아닌 경우.
이러한 경우에 한해 규칙 검사가 동작하지 않습니다.
If you like SONARKUBE, don’t forget to give me a star.