[Java]정규식 사용하여 트위터 해시태그 추출기능 만들기

트위터에 보면 “#” 을 붙여 해시태그를 만듭니다.

그런데, 가만히 해시태그가 되는 규칙을 살펴보면 “#“로 시작해서

특수문자공백이 오면 “#“부터 그 사이를 해시태그로 인식해서 보여줍니다.

다만, 연속적으로 “#“을 사용하면 트위터에선 해시태그로 인식을 하지 않더군요.

예를 들면 “#테스트#테스트1#테스트2″같은 문자열은 각각

“#테스트”, “#테스트1”, “#테스트2” 세개의 해시태그로 인식되어야 할 것 같지만 결과는

아무것도 해시태그로 인식하지 못합니다. 궁금하면 직접 한번 해보세요~*

그래서 회사의 업무와 연관되기도 하여서 해시태그 추출기능 테스트코드를 만들었습니다.

@Test
public void extractHashTagTest() {
    String test ="나는 어딘가에서 #테스트 포를 #가#나다#라라라$ #배$#%@ #443##fefef";
    String test1 ="#아무개가 세미나에 참여했다.";
    String test2 ="#아무개? 이 캐릭터는 누구냐?";
    String test3 ="#작두#망토 어때요?";
    String test4= "말도안돼#니가$정말#그 사람이었다니 말야##이상하군!! 정말";

    Pattern p = Pattern.compile("\\#([0-9a-zA-Z가-힣]*)");
    Matcher m = p.matcher(test4);
    String extractHashTag = null;

    while(m.find()) {
	extractHashTag = sepcialCharacter_replace(m.group());

	if(extractHashTag != null) {
		logger.debug("최종 추출 해시태그 :: {}", extractHashTag);
	}
    }
}

public String sepcialCharacter_replace(String str) {
    str = StringUtils.replaceChars(str, "-_+=!@#$%^&*()[]{}|\\;:'\"<>,.?/~`) ","");

    if(str.length() < 1) {
   	return null;
    }

    return str;
}

test부터 test4까지 테스트를 돌려보면 아래와 같은 결과가 나옵니다.

결과를 보면 아시겠지만,  “#“연속으로 사용한 문자열도 순서적으로 추출할 수 있도록

하였습니다.  “작두“와 “망토“가 결과로 튀어나온거 보면 확인할 수 있죠~

추출된 해시태그에서 “#“는 삭제하였습니다. 순수한 문자열만 추출하기 위해서요.

그래서 한단계를 더 거치게 되는데, 만약 정규식이 최적화되어서 한번에 #을 제외한

문자열을 추출할 수 있다면 더욱 베스트겠죠.

혹시 더 좋은 방법을 알고 계시다면  댓글로 달아주세요~^^

*다른 정규식 예제 포스팅은 아래에서 확인하실 수 있습니다.

Advertisements