티스토리 뷰
* 개요
ex) 나는 바보입니다
나는 개입니다
나는 새입니다
나는 코끼리입니다
나는 ???입니다
에서 ??? 를 가져오고 싶다
* 그룹 캡쳐 ()
나는 (.*)입니다
표현하면 괄호친 부분을 캡쳐하여 가져올 수 있다.
String[] as = {
"나는 바보입니다",
"나는 개입니다",
"나는 새입니다",
"나는 코끼리입니다",
"너는 개구리입니다",
};
for(String s : as ) {
System.out.println(s);
Pattern p = Pattern.compile("나는 (.*)입니다");
Matcher m = p.matcher(s);
if(m.matches() ) {
System.out.println("group 0 : " + m.group(0));
System.out.println("group 1 : " + m.group(1));
} else {
System.out.println("일치 안함");
}
}
matches() 실행 후
group(0) 은 전체를 가져오며,
group(1) 은 첫번재 괄호 를 가져오게 됨
- 따라서 group(1) 은 바보, 개, 새, 코끼리가 각각 반환됨
* 캡쳐하지 않는 그룹 - (?: )
- 괄호 시작에 ?:를 넣으면 캡쳐하지 않음
(?:.*)
Pattern p = Pattern.compile("(?:.*)는 (.*)입니다");
- ?: 없다면 group(1) 은 '나' '너' 가 되야겠지만
- ?: 의해 무시되므로 group(1) 은 동일하게 바보, 개, 새, 코끼리가 됨.
* 패턴 일치부분 활용, 치환 - $1, $2, ... 사용
"나는 개입니다" 를 "개는 나입니다" 로 바꿔보자
for(String s : as ) {
System.out.println(s.replaceAll("(.*)는 (.*)입니다", "$2는 $1입니다"));
}
캡쳐된 그룹은 Matcher#group(i) 로 가져왔지만,
$1, $2 로도 표현 가능
따라서 group(1) = $1 = 나
group(2) = $2 = 개 or 새 ... 등이므로
"$2는 $1입니다" 는 "개는 나입니다" 가 됨
* 그룹에 이름 지정 가능
for(String s : as ) {
System.out.println(s.replaceAll("(.*)는 (?<animal>.*)입니다", "${animal}는 $1입니다"));
}
(?<이름>) 으로 그룹의 이름을 지정하며,
가져다 쓸때는 ${이름} 또는 Matcher#group(이름) 으로 사용 가능함.
https://stackoverflow.com/questions/415580/regex-named-groups-in-java
* 변수 나눠서 패턴 정의한 경우 사용 요령
작성중 ..
* 그룹 캡쳐를 통해서 이클립스에서 편하게 치환 가능
작성중 ..
* 편집 참고
p 2-35
'SW개발 > Java' 카테고리의 다른 글
자바 개발자 중급? (0) | 2018.11.04 |
---|---|
[종합] 자바 중급 - 초보를 넘어서려면 알아야 할 것들 (0) | 2018.11.04 |
정규표현식 AND 표현 , Lookahead 이용 (0) | 2018.08.20 |
이클립스 프로젝트 - Resource Location 폴더 변경 (0) | 2018.04.23 |
Java PriorityQueue 우선순위 큐 (1) | 2018.04.13 |