[Java] 정규 표현식 (regexp)
정규 표현식은 예시로 살펴보는게 가장 좋은 학습 방법인 것 같다.
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 두 가지의 그룹 방식이 있다.
- (?:) ---> non-capturing group 방식으로 단순히 식을 묶어주는 용도이다.
- () ---> 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 |
댓글
이 글 공유하기
다른 글
-
[Java] Integer[] -> int[] 로 변환하기
[Java] Integer[] -> int[] 로 변환하기
2020.10.261. 개요 변환에는 크게 두 가지 종류가 있습니다. 자료구조의 변환. 예를 들어, List를 Integer[]로의 변환. (타입은 유지되고 자료구조만 변환하고 싶은 경우) 자료형의 변환. 예를 들어, int 타입을 Integer 타입으로 변환하고 싶은 경우 해당 포스팅은 자료형을 변환시키고자 하는 것으로 위에서 두 번째 경우에 해당합니다. 그럼 어떤 경우에 자료형을 변환해야할까요? 🤔 int[] 배열을 오름차순 정렬하고싶다면 Arrays.sort()로 간단히 해결할 수 있습니다. 하지만, 내림차순 정렬을 하고싶다면 두 번째 파라미터로 Comparator를 정의해줘야하는데, 이때 value타입은 불가능합니다. 2. Integer[] ---> int[] 로의 변환 Java8의 람다와 스트림을 활용하는 방법으… -
[Java] Map을 순회하는 방법
[Java] Map을 순회하는 방법
2020.07.03Map을 순회하는 방법을 정리해보겠습니다. 첫 번째, Iterator를 통해 접근하기 Map map = new HashMap(); Iterator keys = map.keySet().iterator(); while (keys.hasNext()) { String key = keys.next(); map.get(key); } 두 번째, entrySet으로 접근하기. Map은 하나의 원소로 Key-Value 묶음을 가지기 때문에 원소란 표현 대신 Entry라고 표현합니다. Map map = new HashMap(); for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); } 세 번째… -
[Java] 테스트를 위한 환경 구성
[Java] 테스트를 위한 환경 구성
2020.05.28웹 애플리케이션을 유지보수하거나 추가 개발하는 과정에서 특정 라이브러리의 기능을 테스트해보고 싶은 경우가 많이 있다. 나 같은 경우 간단하게 StringUtils의 메서드 결과 값이 어떻게 나오는지 테스트해보고 싶었는데, 이런 간단한 작업을 하기 위해 메인 소스 영역에 아래와 같은 코드를 넣은 후, 웹 애플리케이션을 구동하는걸 반복하다보니 이건 아니다 싶었다… int idx = StringUtils.indexOf("abcdefg_1234", '_'); log.info("result : ", idx); 반면에 src/test/java 영역에 해당 코드를 작성하면 결과 값을 가볍게 바로 확인할 수 있다. public class StringUtilsTest { @Test public void test() {… -
[Java] XML 파싱
[Java] XML 파싱
2020.05.131. XML 파싱 JSON이 편리하고 많이 사용되는게 사실이지만, XML 또한 많이 사용되는 것도 사실입니다. 그렇기 때문에, 데이터를 XML로 만드는 것과 XML을 파싱해서 데이터를 이용하는 것 둘 다 할 줄 알아야합니다. XML 파싱이라는 작업이 워낙에 일반적이다보니 Java는 XML 파서를 내장하고 있습니다. 2. 내장 라이브러리를 사용한 XML 파싱 예제 아래와 같은 구조의 XML 파일이 있다고하겠습니다. Alsa 25 Bob 28
댓글을 사용할 수 없습니다.