CodeWars 일백 스물 일곱 번째 문제
Updated:
regex pattern to check if string has all characters
public static String regexContainsAll(String str) {
return str.replaceAll(".", "(?=.*$0)");
}
- 6kyu임에도 불구하고 정규식의 얇팍한 지식으로 풀지 못했다.
- 이번에는 새로운 정규식을 배우게 되었다.
- 일단 (?:패턴)은 해당 패턴과 매칭시키지만 그 부분을 특정 변수에 담지 않는다. 라는 의미이다.
- 여기서 패턴은 해당 패턴을 매칭시키고, 그 부분을 특정 변수에 담는다.
- 그 변수 이름은 $0~$9까지의 변수에 저장된다. (그럼 10이상은 뭐냐?)
-
그래서 예를 들어 (z f)ood가 있다면 zood, food와 매칭되는데 이때 zood의 경우 $0 변수에 저장된다. - 이것을 막기위해 (?:패턴)을 사용한다.
- 이제 문제에서 사용한 (?=패턴)을 보자.
- (?:패턴)과 동일하다. 다만 패턴이 일치한 부분 이후부터 다음 매치가 일어나지 않고 패턴 앞에서 다시 매칭된다.
- 즉, 룩업(lookup)을 한다. (이게 뭐야 처음보네)
-
예를 들어 Windows (?=95 98 NT 2000) 은 “Windows 2000”의 “Windows” 부분과 매칭이 되며 다음 매칭은 “2000” 다음 부터가 아닌 “Windows” 다음 부터 진행이 된다. - (?!패턴)은 (?=패턴)과 반대다.
-
Windows (?=95 98 NT 2000) 은 “Windows 3.1”의 “Windows” 부분과 매칭이 된다. - 그래서 위의 식을 해석하면 str이 abc라고 할 경우
- (?=.a)(?=.b)(?=.*c) 이렇게 변한다.
- 그러면 a, b, c가 각각 순서 상관없이 어떤 문자열에 속했는지 아닌지 확인한다.