Regex 패턴들이 불필요하게 만들어져선 안됩니다.

 

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. :star2:

원문으로 바로가기

Star This Project