#05 Regex 언어란?

Edwin·2023년 3월 9일

위키백과에 따르면, Regular Expression(이하, Regex)는 "특정한 규칙을 가진 문자열의 집합을 표현"하는 데 사용하는 형식 언어의 일종이다. 정규표현식은 텍스트 속에서 일치하는 패턴을 찾아 이를 반환하는 메타 문자이다. 등장은 1956년 스티븐 클레이니가 소개했으며, 1970년 벨 연구소에서 사용되었고, 1992년 POSIX.2에 표준화된 이후 다양한 프로그램에서 사용되어지고 있다.

현재 정규 표현식은 프로그래밍 언어, 문자 처리 프로그램, 고급 문서 편집기 등에서 사용되저이고 있으며, 자바와 파이썬을 포함하여 필자가 공부하고 있는 자바스크립트에 이르기까지 여러 프로그래밍 언어의 표준 라이브러리의 일부가 되어 사용되어지고 있다.

텍스트의 수에 대하여

  • ? : 0~1차례 발생된 경우를 탐색한다. /ab?c/ 에는 ac, abc가 그 결과로 탐색된다.
  • * : 0번 이상 발생된 경우를 탐색한다. /ab*c/ 에는 ac, abc, abbc, abbbc 등이 그 결과로 탐색된다.
  • + : 1번 이상 발생된 경우를 탐색한다. /ab+c/ 에는 ac 이외에, abc, abbc, abbbc 등이 그 결과로 탐색된다.
  • {n} : n 만큼의 결과를 탐색한다.
  • {min,} : min번 이상을 탐색한다.
  • {min, max} : 최소값~최대값을 탐색한다.

replace(/(\d)(?=(?:\d{3})+(?!\d))/g, "$1,");

숫자가 입력되었을 때, 단위에 따라서 콤마(,)를 표현하기 위해서 선언된 내용이 위의 정규식표현이다. 도대체 이게 무슨 해괴망측한 표현인지 알 수 없다. 이를 해결하기 위해서 2시간은 가만히 바라만 보고 있었던 것 같다. 그리고 결국에는 이해해 냈다.

먼저 위의 코드의 replace 부분을 독해하면 다음과 같다.

  • / ... /g : 정규식표현
  • "$1," : 정규식에서 만들어진 그룹마다 콤마(,)를 더해서 반환해 줄 것이다.

그리고 이어지는 정규식에 대해서 독해해 보자.

  • (\d) : 정규식에서 (소괄호)는 그룹을 형성하는 것을 의미한다. 그리고 형성된 그룹의 결과로, replace는 동작하여 그룹마다 콤마(,)를 생성해 주는 것이다.
  • (?=(?:\d{3})+(?!\d)) : 그리고 이 부분이 문제이다.

(?=(?:\d{3})+(?!\d))

먼저는 전방탐색x(?=y)이다. x다음에 y가 조재하면 x를 반환한다.

  • (\d) 다음에
  • (?=(?:\d{3})) : 하나의 숫자 다음에 연속되는 3개의 숫자가 존재하면, 전방에 있는 x((\d))를 그룹으로 생성한다는 의미이다. 그렇다면 뒤에 있는 y는 (소괄호) 안에 있는데 그룹을 생성해줄까? 그렇지 않다. (?:) 소괄호 안에 ?:는 해당 내용을 묶기는 했지만, 그룹으로 생성하지 않음을 선언하기 때문이다. 이 결과 1234 이라는 숫자가 입력되면 (1) 이 그룹으로 생성되는 것이다.
  • 그런데 이 y((?=(?:\d{3})+(?!\d))는 포함된 내용이 더 많다.

다음으로는 부정전방탐색(x(?!y))이다. x뒤에 y가 없으면 x를 반환하는 것이다. 그렇다면 위의 코드를 읽어보자.

  • (?:\d{3})+(?!\d) : 연속되는 숫자 3개 뒤에 숫자가 존재하지 않으면 이다. 그렇다면 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 연습하기 좋은 사이트가 있다.

profile
신학전공자의 개발자 도전기!!

0개의 댓글