정규 표현식이란, 특정한 규칙을 가진 문자열의 집합을 표현하는데 쓰이는 형식 언어이다. 정규 표현식을 사용하면 수많은 문자들 사이 전화번호 형식의 문자를 찾을 수도 있고, 찾은 문자열을 다른 문자열로 고칠 수도 있어 아주 유용하게 쓰인다.
위와 같은 다양한 특수문자와 괄호를 활용하여 수 천가지 형태의 문자열을 표현할 수 있다.
자바의 Pattern클래스는 정규 표현식이 컴파일된 클래스이다.
Pattern p = Pattern.compile("a...b");
Matcher m = p.matcher("aaaab");
boolean b = m.matches(); // true
이 클래스에서는 우선 정규 표현식을 컴파일해서 인스턴스로 만들어야 한다. 이후 만든 패턴을 가지고 Matcher 객체를 생성할 수 있다. 생성된 Matcher 객체는 패턴과 문자열을 비교할 수 있게 해준다.
컴파일과 비교를 한 번에 해주는 것이 matches
메서드다.
boolean b = Pattern.matches("a...b", "aaaab"); // true
matches
메서드를 사용하면 위의 코드를 한 줄로 줄일 수 있다. 예시로 사용된 코드는 a로 시작하고 b로 끝나며, 사이에 문자 3개가 있는 문자열 패턴이 있는지 검사한다.
특정 문자를 포함하는지 검사하는 또 다른 메서드로 .contains()
가 있다. .contains()
와 .matches()
의 차이점은 전자는 인자로 전달 받은 특정 문자의 포함 여부를 확인하는 메서드인 반면에, 후자는 정규 표현식으로 인자를 받아 동일한 패턴의 문자열인지를 확인하는 메서드이다. 따라서 정규 표현식을 잘 알기만 한다면 원하는 형태의 문자열을 찾을 때는 후자의 메서드를 더 유용하게 쓸 수 있다.
import java.util.regex.Pattern;
public class CheckPatternInString {
public static void main(String[] args) {
System.out.println(PatternCheck("aabbB")); // true
System.out.println(PatternCheck("Aabbb")); // true
System.out.println(PatternCheck("qwerAqeebqwer")); // true
}
public static boolean PatternCheck(String str) {
// 다 소문자로 변환
String string = str.toLowerCase();
// 패턴 정의 (a로 시작해 b로 끝나는 길이 5의 문자열 or b로 시작해 a로 끝나는 길이 5의 문자열 체크. 대소문자 상관X)
String pattern = ".*a...b.*";
String pattern2 = ".*b...a.*";
// boolean 정의
boolean first = Pattern.matches(pattern, string);
boolean second = Pattern.matches(pattern2, string);
// if문, boolean true면 true 반환
if(first == true||second == true) return true;
else return false;
}
}
알고리즘 문제로 '(대소문자 상관없이) a로 시작해 b로 끝나는 길이 5의 문자열 or b로 시작해 a로 끝나는 길이 5의 문자열 확인'을 정규 표현식과 Pattern.matches()
를 이용해 푼 코드이다. 패턴의 정규 표현식을 더 간단하게 작성하면 boolean을 1개만 쓸 수도 있을 것 같은데, 정규 표현식에 좀 더 익숙해지는 것부터 해야 한다.
참고 자료