Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개

JS · 07 Jun 2020

String.matches()로 특정 패턴의 문자열을 포함하는지 확인할 수 있습니다. 특정 패턴이란 정규표현식(Regex)를 의미합니다. 문자열에 정규표현식이 일치하는지를 boolean으로 리턴합니다. 이를 통해 문자열이 내가 찾는 패턴으로 구성되어있는지 알 수 있습니다.

여러 패턴들을 예제로 소개하면서 matches()를 적용하는 방법을 알아보겠습니다.

정규표현식에 대해서 자세히 알고 싶으시면 정규표현식(regex), 다양한 예제로 쉽게 이해하기를 참고하시면 좋습니다.

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

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"));

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" 둘 중의 하나의 문자를 의미합니다.

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

문자, 숫자 패턴 찾기

다음 예제는 a가 0개 이상, 그리고 숫자가 0개 이상인 패턴을 찾습니다.

String str = "aaa123";
System.out.println(str.matches("a*[0-9]*"));

Output:

true

문자열 패턴 찾기

다음은 "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개가 있기만 하면 됩니다.

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개를 의미합니다.

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

정규표현식 .가 아니고, 단순히 문자 .를 표현하고 싶다면 \\.으로 써줘야 합니다.

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개 이상을 의미합니다.

[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

정규표현식에서 단순한 문자의 의미로 [를 사용하려면 \\[으로 입력해야 합니다. -의 경우에도 \\-으로 입력해야 합니다.

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);

참고

codechachaCopyright ©2019 codechacha