String.matches()
로 특정 패턴의 문자열을 포함하는지 확인할 수 있습니다.
특정 패턴이란 정규표현식(Regex)를 의미합니다. 문자열에 정규표현식이 일치하는지를 boolean으로 리턴합니다.
이를 통해 문자열이 내가 찾는 패턴으로 구성되어있는지 알 수 있습니다. 여러 패턴들을 예제로 소개하면서 matches()
를 적용하는 방법을 알아보겠습니다.
정규표현식에 대해서 자세히 알고 싶으시면 정규표현식(regex), 다양한 예제로 쉽게 이해하기를 참고하시면 좋습니다.
1. matches() 기본 예제
matches()
는 인자로 정규표현식을 받습니다. 그리고 문자열과 패턴이 일치하는지를 리턴합니다.
String.contains()와 큰 차이가 없어보이지만 다음 예제를 보면 차이점이 있습니다.
String str = "Welcome to codechacha";
System.out.print("Does String contains regex (.*)code(.*) ? : ");
System.out.println(str.matches("(.*)code(.*)"));
System.out.print("Does String contains regex code ? : ");
System.out.println(str.matches("code"));
System.out.print("Does String contains regex Welcome(.*) ? : " );
System.out.println(str.matches("Welcome(.*)"));
- 위의 예제에서
(.*)
는 0개 이상으로 이루어진 어떤 문자열을 의미합니다. - 그렇기 때문에 정규표현식
(.*)code(.*)
는 code 양옆에 어떤 문자열이 오든 상관없이 code가 존재하는지만 확인합니다. - 이 정규표현식은
contains("code")
와 거의 동일하다고 생각하면 됩니다. - 반면에 정규표현식
code
는 양 옆에 어떤 문자가 오면 일치하지 않는다고 판단합니다. 그렇기 때문에 false가 리턴됩니다. Welcome(.*)
는 Welcome으로 시작하고 그 뒤에 0개 이상의 문자가 오는 패턴이 있을 때 true를 리턴합니다.
Output:
Does String contains regex (.*)code(.*) ? : true
Does String contains regex code ? : false
Does String contains regex Welcome(.*) ? : true
2. contains()와 matches()의 차이점
위에서 설명했듯이, contains()
는 단순히 인자로 전달된 문자열이 존재하는지 여부를 리턴합니다.
반면에 matches()
는 정규표현식을 인자로 받고 동일한 패턴의 문자열이라면 true를 리턴합니다.
정규표현식은 찾는 문자의 주위의 문자들도 고려하기 때문에 정규표현식을 자세히 알지 못하면 적용하기 어려울 수 있습니다.
System.out.print("Does String contains regex (.*)code(.*) ? : ");
System.out.println(str.matches("(.*)code(.*)"));
System.out.print("Does String contains regex code ? : ");
System.out.println(str.matches("code"));
3. True/true 문자열 패턴 찾기
사용자로부터 true라는 문자열을 받았을 때 그 문자열이 실제로 true인지 확인을 해야 합니다. 물론, 대소문자를 구분하기 위해 if문을 두번 사용하거나 contains를 사용할 수 있습니다. 하지만 이 글에서는 matches에 대해서 배우기 때문에 matches를 이용하여 구현해보았습니다.
다음과 같이 matches()
로 구현하였습니다.
String str = "True";
System.out.println("Is it true ? : " + str.matches("[Tt]rue"));
str = "true";
System.out.println("Is it true ? : " + str.matches("[Tt]rue"));
str = "yes";
System.out.println("Is it true ? : " + str.matches("[Tt]rue"));
Output:
Is it true ? : true
Is it true ? : true
Is it true ? : false
정규표현식 [Tt]
는 "T" 또는 "t" 둘 중의 하나의 문자를 의미합니다.
4. True, Yes 문자열 패턴 찾기
다음은 True/true, Yes/yes 문자열을 함께 찾는 예제입니다.
String str = "yes";
System.out.println("Is it true or yes ? : " + str.matches("[Tt]rue|[Yy]es"));
str = "true";
System.out.println("Is it true or yes ? : " + str.matches("[Tt]rue|[Yy]es"));
str = "no";
System.out.println("Is it true or yes ? : " + str.matches("[Tt]rue|[Yy]es"));
정규표현식에서 |
는 or를 의미합니다.
Output:
Is it true or yes ? : true
Is it true or yes ? : true
Is it true or yes ? : false
5. 문자, 숫자 패턴 찾기
다음 예제는 a가 0개 이상, 그리고 숫자가 0개 이상인 패턴을 찾습니다.
String str = "aaa123";
System.out.println(str.matches("a*[0-9]*"));
Output:
true
6. 문자열 패턴 찾기
다음은 "H"로 시작하고 그 다음 어떤 문자가 오고, 마지막으로 "llo"로 끝나고 패턴을 찾습니다.
System.out.println("Hello".matches("H.llo"));
System.out.println("Hallo".matches("H.llo"));
System.out.println("Hollo".matches("H.llo"));
Output:
true
true
true
정규표현식에서 .
는 어떤 문자 1개를 의미합니다. 따라서 H 다음으로 어떤 문자 1개가 있기만 하면 됩니다.
7. EX로 시작하는 패턴 찾기
다음은 "EX_"로 시작하고 그 다음 a~g
의 문자가 오거나 1~5
의 숫자가 오는 패턴을 찾습니다.
System.out.println("Ex_a".matches("Ex_[a-g1-5]"));
System.out.println("Ex_g".matches("Ex_[a-g1-5]"));
System.out.println("Ex_1".matches("Ex_[a-g1-5]"));
System.out.println("Ex_6".matches("Ex_[a-g1-5]"));
Output:
true
true
true
false
정규표현식에서 a-g
는 a에서 g까지의 알파벳 1개를 의미합니다.
그리고, 1-5
는 1에서 5까지의 숫자 1개를 의미합니다.
8. This로 시작하고 .으로 끝나는 패턴
다음은 This로 시작하고 "."으로 끝나는 패턴을 찾습니다. 만약 "."으로 끝나지 않으면 false를 리턴합니다.
System.out.println("This is the right decision.".matches("This.*\\."));
System.out.println("This is me".matches("This.*\\."));
System.out.println("This is my mistake.".matches("This.*\\."));
Output:
true
false
true
정규표현식 .
가 아니고, 단순히 문자 .
를 표현하고 싶다면 \\.
으로 써줘야 합니다.
9. It + a few 패턴 찾기
It으로 시작하고 a few가 중간에 들어있는 패턴을 찾습니다.
System.out.println("It's been a few days".matches("It.+a few.*"));
System.out.println("It's been a few over a year".matches("It.+a few.*"));
System.out.println("It's been about a week".matches("It.+a few.*"));
Output:
true
true
false
정규표현식에서 .+
는 문자 1개 이상을 의미합니다.
10. [A-1] 패턴 찾기
다음은 "[A-숫자]" 로 시작하는 패턴을 찾습니다.
System.out.println("[A-1] Jason".matches("\\[A\\-.+\\].*"));
System.out.println("[A-12] Todd".matches("\\[A\\-.+\\].*"));
System.out.println("[B-12] MJ".matches("\\[A\\-.+\\].*"));
Output:
true
true
false
정규표현식에서 단순한 문자의 의미로 [
를 사용하려면 \\[
으로 입력해야 합니다. -
의 경우에도 \\-
으로 입력해야 합니다.
11. Pattern으로 matches를 적용하는 방법
String.matches()
가 아니라 Pattern 클래스를 이용하여 matches를 적용할 수 있습니다.
다음과 같이 Pattern.matches()
에 regex와 string을 인자로 전달하면 String.matches()
와 동일한 결과를 리턴합니다.
String text = "The URL is: http://mydomain.com";
String regex = ".*http://.*";
boolean matches = Pattern.matches(regex, text);
System.out.println(matches);
12. 참고
Related Posts
- Java - Unsupported class file major version 61 에러
- Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개
- Java - 문자열 공백제거 (trim, replace)
- Java - replace()와 replaceAll()의 차이점
- Java - ArrayList 초기화, 4가지 방법
- Java - 배열 정렬(Sorting) (오름차순, 내림차순)
- Java - 문자열(String)을 비교하는 방법 (==, equals, compare)
- Java - StringBuilder 사용 방법, 예제
- Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
- Java IllegalArgumentException 의미, 발생 이유
- Java - NullPointerException 원인, 해결 방법
- Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
- Java - compareTo(), 객체 크기 비교
- Java - BufferedWriter로 파일 쓰기
- Java - BufferedReader로 파일 읽기
- Java charAt() 함수 알아보기
- Java - BigInteger 범위, 비교, 연산, 형변환
- Java contains()로 문자(대소문자 X) 포함 확인
- Java - Set(HashSet)를 배열로 변환
- Java - 문자열 첫번째 문자, 마지막 문자 확인
- Java - 문자열 한글자씩 자르기
- Java - 문자열 단어 개수 가져오기
- Java - 1초마다 반복 실행
- Java - 배열을 Set(HashSet)로 변환
- Java - 여러 Set(HashSet) 합치기
- Java - 명령행 인자 입력 받기
- Java - 리스트 역순으로 순회, 3가지 방법
- Java - 특정 조건으로 리스트 필터링, 3가지 방법
- Java - HashMap 모든 요소들의 합계, 평균 계산
- Java - 특정 조건으로 HashMap 필터링
- Java - 싱글톤(Singleton) 패턴 구현
- Java - 숫자 왼쪽에 0으로 채우기
- Java - String 배열 초기화 방법
- Java - 정렬된 순서로 Map(HashMap) 순회
- Java - HashMap에서 key, value 가져오기