
위키백과에 따르면, Regular Expression(이하, Regex)는 "특정한 규칙을 가진 문자열의 집합을 표현"하는 데 사용하는 형식 언어의 일종이다. 정규표현식은 텍스트 속에서 일치하는 패턴을 찾아 이를 반환하는 메타 문자이다. 등장은 1956년 스티븐 클레이니가 소개했으며, 1970년 벨 연구소에서 사용되었고, 1992년 POSIX.2에 표준화된 이후 다양한 프로그램에서 사용되어지고 있다.
현재 정규 표현식은 프로그래밍 언어, 문자 처리 프로그램, 고급 문서 편집기 등에서 사용되저이고 있으며, 자바와 파이썬을 포함하여 필자가 공부하고 있는 자바스크립트에 이르기까지 여러 프로그래밍 언어의 표준 라이브러리의 일부가 되어 사용되어지고 있다.
숫자가 입력되었을 때, 단위에 따라서 콤마(,)를 표현하기 위해서 선언된 내용이 위의 정규식표현이다. 도대체 이게 무슨 해괴망측한 표현인지 알 수 없다. 이를 해결하기 위해서 2시간은 가만히 바라만 보고 있었던 것 같다. 그리고 결국에는 이해해 냈다.
먼저 위의 코드의 replace 부분을 독해하면 다음과 같다.
그리고 이어지는 정규식에 대해서 독해해 보자.
먼저는 전방탐색x(?=y)이다. x다음에 y가 조재하면 x를 반환한다.
다음으로는 부정전방탐색(x(?!y))이다. x뒤에 y가 없으면 x를 반환하는 것이다. 그렇다면 위의 코드를 읽어보자.
1234 를 사용자가 입력했다고 하자.
- 1 234 가 먼저 나눠질 것인데, 보면 연속되는 숫자 3개(234) 뒤에 입력된 내용 뒤에 숫자가 없기 때문에 (1)?=(?:234)가 생성될 것이고 해당 내용에 따라서 1,234 가 반환된다.
12345 를 사용자가 입력했다고 하자.
- 1 (2) (?:345) 가 만들어질이고, 그룹에는 (2)가 등록되고 결과에 따라서 12, 234 가 반환된다.
1234567 를 사용자가 입력했다고 하자.
- 123 (4) (?:567) 가 만들어질 것이고, 그룹에는 (4)가 등록되고 결과에 따라서 1234,567 이 반환될 것이다.
그런데 여기에 / ... /g 가 있었음을 기억해야 한다.
정규식은 해당 조건이 있을 때마다 내용을 반복하며 실행한다.
1234,567 에서 정규식은 한 번도 발동한다.
- 숫자가 아닌 콤마(,) 앞에서 조건에 부합하는 내용을 찾은 것이다.
- (1) (?:234) 의 결과에 따라서 그룹에는 (1) 또 추가적으로 등록되고 결과로 1,23 4,567 이 반환되는 것이다.
1234567890 를 사용자가 입력했다면,
- 123456 (7) 890 : 123456 7, 890
- 조건에부합하는내용 찾음 : 123 (4) 567,890 : 123 4, 56 7, 890
- 조건에부합하는내용 찾음 : (1) 234, 567, 890 : 1, 23 4, 56 7, 890
- 정리하면 입력된 내용에서 (1) 23 (4) 56 (7) 890 3개의 그룹을 발견했고, 해당 내용을 replace 매서드에 따라서 결과를 반환한 것이다.
regexone 연습하기 좋은 사이트가 있다.