티스토리 뷰

* 개요


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

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함