정규 표현식은 예시로 살펴보는게 가장 좋은 학습 방법인 것 같다.

 

String#replaceAll 메서드를 이용한 정규 표현식 예


첫 번째 요구사항 --- 전체 URL에서 도메인의 정보만 뽑아내고 싶다.

@Test
public void 정규_표현식_테스트() {
    String str = "https://pangtrue.tistory.com/post/100";
    str = str.replaceAll("(?i:https?://([^/]+)/.*)", "$1");

    assertEquals(str, "pangtrue.tistory.com");
}

 

위 regexp를 분석해보자.

먼저, regexp에는 non-capturing group과 capturing group 두 가지의 그룹 방식이 있다.

  1. (?:)   --->  non-capturing group 방식으로 단순히 식을 묶어주는 용도이다.
  2. ()      ---> capturing group 방식으로 식을 묶어주는 용도 외에 해당 그룹의 식과 매칭된 결과를 저장한다. 
                    순서대로 식별 번호가 붙으며, 달러 기호($)와 같이 사용한다. 예) 첫 번째 그룹의 식과 매칭된 결과 $1

 

다음으로, regexp에는 특별한 의미를 갖는 메타 문자(metacharacter)라는게 있다. 아래 표를 보자.

정규 표현식 설명
. 어떤 문자든 상관없이, 문자 하나를 의미한다.
* 앞의 문자가 0개 이상 반복된다는 의미이다.            (수량)
+ 앞의 문자가 1개 이상 반복된다는 의미이다.             (수량)
? 앞의 문자가 0개 또는 1개 있을 수 있다는 의미이다. (수량)
[] 문자의 집합이나 범위를 의미한다. 예) [ ^/ ] 는 /를 제외한 모든 문자의 집합.
{} 앞의 문자나 문자 집합에 대한 수량의 범위를 나타낸다. 예) { 2, }는 두 개 이상, { 3, 5 }는 3개 이상 5개 미만

 

이제 위의 regexp에서 https?  라고 사용된 부분을 해석하면, ? 앞의 문자 즉, s가 0개 또는 1개 있을 수 있다는 의미이다.

이 말은 http도 되고 https도 된다는 의미.

 

그 뒤의 ([^/]+)  부분을 보면, 먼저 해당 식은 () 묶었기 때문에 첫 번째 캡쳐링 그룹이다. 문자의 집합을 의미하는 [] 안에는 ^/ 슬래시를 제외한 모든 문자 집합을 의미하고, 해당 문자 집합은 1개 이상 반복된다라는 걸 알 수 있다.

 

마지막으로 replaceAll 메서드의 두 번째 파라미터인 대체 문자로 캡쳐링된 매칭 결과를 사용했다. (도메인 부분)

 

참고자료


[1] https://m.blog.naver.com/regexp

[2] https://mean79.tistory.com/478

 

'Programming > Java' 카테고리의 다른 글

[Java] Integer[] -> int[] 로 변환하기  (0) 2020.10.26
[Java] Map을 순회하는 방법  (0) 2020.07.03
[Java] 테스트를 위한 환경 구성  (0) 2020.05.28
[Java] XML 파싱  (0) 2020.05.13
[Java] JVM (Java Virture Machine)  (0) 2020.04.19