CodeWars 일백 열 세 번째 문제
Updated:
Evil Autocorrect Prank
public static String autocorrect(String input) {
Pattern TOKENIZER = Pattern.compile("\\w+\\W*");
Matcher mc = TOKENIZER.matcher(input);
String output = "";
while(mc.find()) {
String group = mc.group();
if(group.matches("(?i)u\\W*") || group.matches("(?i)(YO)(?i)U+\\W*")) {
output += group.replaceAll("(?i)[YOU]+", "your sister");
} else {
output += group;
}
}
return output;
//return input.replaceAll("(?i)\\b(u|you+)\\b", "your sister");
}
- 최근 정규식에 대해서 조금 자신감이 붙어서 쉽게까지는 아니고 여러번의 시도를 통해서 풀 수 있었다.
- 그러나 Best 코드를 보니 역시나 정규식은 광활한 분야 같다.
- 일단 (?i)는 뒤에 문자에 대해서 대소문자를 구분하지 않는다.
- \b의 경우는 이번에 처음 알았는데 대괄호 밖에 있을 때 단어 경계와 일치하고 대괄호 안에 있을 때는 백스페이스와 일치한다고 한다.
- ()의 경우 그 안에 문자를 하나의 문자로 인식
-
은 or 의미이다. -
그래서 (u you)의 의미는 u이거나 you 이라는 뜻이다. - +는 앞의 문자가 없거나 무한정 많을 수 있다는 뜻이다.
-
즉, (u you+)는 u or you or youu or youuu … 무한대가 된다. - 따라서 위의 정규식을 해석하면 u or you or you(u가 무한정) 3가지 경우에 대해서 대소문자를 무시하고 앞뒤 경계와 상관없이 일치하는 문자에 대해서 your sister로 변경한다는 뜻이다.