트위터에 보면 “#” 을 붙여 해시태그를 만듭니다.
그런데, 가만히 해시태그가 되는 규칙을 살펴보면 “#“로 시작해서
특수문자나 공백이 오면 “#“부터 그 사이를 해시태그로 인식해서 보여줍니다.
다만, 연속적으로 “#“을 사용하면 트위터에선 해시태그로 인식을 하지 않더군요.
예를 들면 “#테스트#테스트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까지 테스트를 돌려보면 아래와 같은 결과가 나옵니다.
결과를 보면 아시겠지만, “#“연속으로 사용한 문자열도 순서적으로 추출할 수 있도록
하였습니다. “작두“와 “망토“가 결과로 튀어나온거 보면 확인할 수 있죠~
추출된 해시태그에서 “#“는 삭제하였습니다. 순수한 문자열만 추출하기 위해서요.
그래서 한단계를 더 거치게 되는데, 만약 정규식이 최적화되어서 한번에 #을 제외한
문자열을 추출할 수 있다면 더욱 베스트겠죠.
혹시 더 좋은 방법을 알고 계시다면 댓글로 달아주세요~^^
*다른 정규식 예제 포스팅은 아래에서 확인하실 수 있습니다.