나쁜 REGEX와 좋은 REGEX와 최상의 REGEX

1.REGEX란?



정규식(RegExp/regex)이란 문자열의 패턴을 표현하는 표기법
  /pattern/

2. 좋은 REGEX와 나쁜 REGEX


[2016-05-02T16:05:18 #92430] INFO -- : Served asset /navi/hu-0005-03/style.css - 304 Not Modified (1ms)​필요한 정보​
時間: 2016-05-02T16:05:18 #92430​
種類: INFO​
情報: Served asset /navi/hu-0005-03/style.css - 304 Not Modified (1ms)​

 1. \[(.*)\]\s+(.*)\s--\s:\s+(.*) ​
 2. \[([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d
    +#\d+)\]\s+(.*)\s--\s:\s+(.*)​

​2개의 레게크스 pattern을 보면, 어느 것이 좋을까, 곧바로 대답할 수 있습니다.
기본적으로 레게크스 패턴은 길면 길수록 좋습니다. 물론 정답이어야 합니다.
왜?
보통은, 무엇이든 검색할 때, 상세하게 정보를 입력하면, 결과가 올바르고, 시간도 걸리지 않는다. 이것도 함께.


3. 일치하는 입력과 일치하지 않는 입력


 1. \[(.*)\]\s+(.*)\s--\s:\s+(.*) ​
 2. \[([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d
    +#\d+)\]\s+(.*)\s--\s:\s+(.*)​
[2016-05-02T16:05:18 #92430] INFO -- : Served asset /navi/hu-0005-03/style.css - 304 Not Modified (1ms)​(1) 모든 문자를 받으려면 (.*) 사용 -> 일치하지 않는 입력
(2) 시간의 상세 포맷을 사용합니다 -> 일치하는 입력


4. 좋은 REGEX와 나쁜 REGEX의 비교


\[(.*)\]\s+(.*)\s--\s:\s+(.*)



1-4 스텝까지 문자 같을 때(매치하는 입력), 1 스텝이 걸린다.
그러나 5 단계에서 .를 뒤집어 (비교) 한 후 다음 문자를 검색하려면 레렉스가 마지막부터 처음까지 천천히 검색해야합니다.
여기서 158 단계로 보입니다.
일치하지 않는 입력의 자쿠텐(약점)이 곧바로 보입니다, 뒤의 문자는 길면 길수록 단계가 걸립니다. 시간이 걸리는
뒤의 (. *)도 마찬가지입니다.
모두 324 걸립니다.
*\[([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d+#\d+)\]\s+(.*)\s--\s:\s+(.*)​**




일치하는 입력을 사용하기 때문에 문자 같은 경우 한 단계가 걸립니다.
이제 27 단계에서 시간이 검색을 완료했습니다. 모두 158 단계가 걸립니다.
사실, 아직 최상의 REGEX가 아니라 개선할 수 있습니다.

5. 최고의 REGEX



(2) 사이 (.)에 있습니다. 좋지 않아. 개선할 수 있습니다.
*\[([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d +#\d+)\]\s+([A-Z]*)\s-+\s:\s+(.*)​**
(.*)는 패턴의 끝에있을 때 괜찮습니다, 한 단계가 걸립니다.

6. 정리



좋은 regex를 작성하려면 :
- 일치하는 입력을 사용합니다. (스텝 수가 감소한다)
- 패턴 사이에 (.*)를 사용하지 않도록 합니다.​

좋은 웹페이지 즐겨찾기