[Java]정규식 예제

지금 오픈소스팀에서 만들고 있는 위키중 중요부분인 파서부분의 정규식 예제를 간단히

만들어보았습니다.

많은 위키구문중에 대표적으로 “볼드“와 “이탤릭체“만 테스트코드로

작성했습니다.

고민중인 것은, “볼드와 이탤릭체를 함께 치환할 수 없느냐 하는 문제“입니다.

아래 코드를 보시면,

package com.glider.test.service;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author bluepoet
 *
 */
public class GliderWikiTest {
	Logger logger = LoggerFactory.getLogger(GliderWikiTest.class);

	@Test
	public void 별표_가운데문자열_처리() {
		String str = "지금은 알 수 없어 *그대aff2*";
		Pattern pattern = Pattern.compile("\\*([0-9a-zA-Z가-힣]*)\\*");
		Matcher match = pattern.matcher(str);

		for(int i=0; match.find(); i++) {
			logger.debug("## 정규식안의 문자열 빼내기 : {}", match.group(1));
		}
	}

	@Test
	public void 별표_볼드로_치환() {
		String str = "지금은 알 수 없어 *그대aff2* 떠나는 내 진심을*fefefefefefe럴마널더22323*";
		Pattern pattern = Pattern.compile("\\*([0-9a-zA-Z가-힣]*)\\*");
		Matcher match = pattern.matcher(str);

		while(match.find()) {
			logger.debug("## 일치하는 문자열 : {}", match.group());
			str = str.replace(match.group(), getHtml(match.group(), EsCharacter.BOLD));
		}

		logger.debug("## 별표를 볼드로 치환한 문자열 : {}", str);
	}

	@Test
	public void 이탤릭체_치환() {
		String str = "이젠 나도 _지쳤어_";
		Pattern p = Pattern.compile("\\_([0-9a-zA-Z가-힣]*)\\_");
		Matcher match = p.matcher(str);

		while(match.find()) {
			logger.debug("## 일치하는 문자열 : {}", match.group());
			str = str.replace(match.group(), getHtml(match.group(), EsCharacter.ITALIC));
		}

		logger.debug("## 언더바를 이탤릭체로 치환한 문자열 : {}", str);
	}

	@Test
	public void 볼드_이탤릭체_함께치환() {
		String str = "이젠 나도 _지쳤어_ 그냥 *힘차게223dfefef* 발돋움 하는거야!!";
		Pattern p = Pattern.compile("\\_([0-9a-zA-Z가-힣]*)\\_");
		Pattern p1 = Pattern.compile("\\*([0-9a-zA-Z가-힣]*)\\*");
		Matcher m = p.matcher(str);
		Matcher m1 = p1.matcher(str);

		while(m.find()) {
			str = str.replace(m.group(), getHtml(m.group(), EsCharacter.ITALIC));
		}

		while(m1.find()) {
			str = str.replace(m1.group(), getHtml(m1.group(), EsCharacter.BOLD));
		}

		logger.debug("## 볼드/이탤릭체 함께 치환한 문자열 : {}", str);
	}

	public String getHtml(String str, EsCharacter ch) {
		String result = null;

		switch (ch) {
		case BOLD:
			result = "<b>"+replaceChBlank(str,"\\*")+"</b>";
			break;
		case ITALIC:
			result = "<I>"+replaceChBlank(str,"\\_")+"</I>";
			break;
		default:
			break;
		}

		return result;
	}

	public String replaceChBlank(String str, String ch) {
		return str.replaceAll(ch, "");
	}

	public enum EsCharacter {
		BOLD, ITALIC;
	}
}

볼드_이탤릭체_함께치환() 메소드를 보면, 각자 정규표현식을 따로 만들고 매쳐도 따로

만들어 while문을 두번 돌리고 있습니다.

실제로 파서를 만들때, 당연히 저런 방식으로는 만들면 안되겠지요.

한번 전체 구문을 돌면서 모든 위키구문을 치환하는게 바람직할 것입니다.

 

jspwiki를 좀 뜯어봤는데, 파서 부분을 파악하는것도 쉽지가 않네요 ㅎㅎ

 

*테스트*입니다. 잘 _될까요_??

 

위의 예제 문자열에서 *와 _사이의 문자열을 정규식으로 동시에 치환할 수 있는

좋은 방법 알고 계시면 댓글 부탁드릴게요^^

Advertisements

[Java]정규식 예제”에 대한 9개의 생각

  1. public void 볼드_이탤릭체_함께치환() {
    String str = “이젠 나도 _지쳤어_ 그냥 *힘차게223dfefef* 발돋움 하는거야!!”;
    // Pattern p = Pattern.compile(“\\_([0-9a-zA-Z가-힣]*)\\_”);
    Pattern p = Pattern.compile(“([\\_\\*])([0-9a-zA-Z가-힣]*)([\\_\\*])”);
    // Pattern p1 = Pattern.compile(“\\*([0-9a-zA-Z가-힣]*)\\*”);
    Matcher m = p.matcher(str);
    // Matcher m1 = p1.matcher(str);

    while(m.find()) {
    switch(m.charAt(0)) { // 이 식이 맞는지 모르겠네요.. javascript 기준으로 썼습니다.
    case “\\*” :
    str = str.replace(m.group(), getHtml(m.group(), EsCharacter.ITALIC)); break;
    case “\\_” :
    str = str.replace(m1.group(), getHtml(m1.group(), EsCharacter.BOLD)); break;
    default : break;
    }
    }

    // while(m1.find()) {
    // str = str.replace(m1.group(), getHtml(m1.group(), EsCharacter.BOLD));
    // }

    logger.debug(“## 볼드/이탤릭체 함께 치환한 문자열 : {}”, str);
    }

    아얘 처음부터 이렇게 찍고가면.. = =;.. 좀 귀찮아지겠죠..?

    • or로 해결했습니다. 치환할 정규식이 많을때 어떻게 처리해야 될지 고민해봐야겠네요

      쭈욱 or로 연결해야 되나 ㅡㅡ;;

      암튼 고마워요 재훈씨^^

  2. ㅎㅎ 재훈씨~

    네~ 정규식에 대한 공부가 필요할것 같네요. 전체 스트링을 돌면서 원하는 문자열을

    정규식으로 찾아 일괄적으로 바꾸게끔 로직을 수정해야 될것 같아요^^

  3. 핑백: [Java]정규식 “|(or)” 사용하기 | bluepoet's diary

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중