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로 변경한다는 뜻이다.