정규 표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식언어 입니다.

정규 표현식 정리

정규 표현식 메타문자

일정한 의미를 가지고 쓰는 특수문자를 메타문자라고 합니다.

  • .
  • []
  • ^
  • $
  • {n,m}
  • *
  • ?
  • +

메타문자별로 간단한 예를 들어 보겠습니다.

. 모든 문자와 일치합니다.

'test !@#123 한글'.match(/./g)
(14) ["t", "e", "s", "t", " ", "!", "@", "#", "1", "2", "3", " ", "한", "글"]

[] 대괄호 사이에 존재하는 문자들중 하나를 찾습니다.

'test !@#123 한글'.match(/[t!한]/g)
//result
(4) ["t", "t", "!", "한"]

[^] 대괄호 안에서는 부정을 나타냅니다. ^ 다음에오는 문자를 제외한 모든 문자와 일치합니다.
대괄호 밖에서는 문자열의 시작과 일치합니다.

'test !@#123 한글'.match(/[^(test)]/g)
(10) [" ", "!", "@", "#", "1", "2", "3", " ", "한", "글"]

대괄호 안에서 ^는 다음에오는 문자열의 제외하하고 모든 문자열과 일치합니다.

'baby baby baby'.match(/^baby/g)
//result
["baby"]

대과호 밖에서 ^ 는 문자열의 시작과 일치합니다.
뭄자열 시작의 baby와 일치합니다.

  • $ 문자열의 끝과 일치합니다.
    'test1 test2 test3'.match(/(test\d)/g);
    'test1 test2 test3'.match(/(test\d)$/g);
    
//result
(3) ["test1", "test2", "test3"]
["test3"]

$가 포함되어 test3만 일치 시킵니다.

\s 공백문자를 일치 시킵니다.
\S 공백 문자를 제외한 문자를 일치 시킵니다.

'this is empty area'.match(/\s/g)
'this is empty area'.match(/\S/g)
//result
(3) [" ", " ", " "]
(15) ["t", "h", "i", "s", "i", "s", "e", "m", "p", "t", "y", "a", "r", "e", "a"]

정규 표현식에서 메타 문자의 대소문자 관계는 ^ not 의 의미를 갖고 있습니다.

\d 숫자를 일치 시킵니다.
\D 숫자를 제외한 문자를 일치 시킵니다.

'123 is number text'.match(/\d/g)
'123 is number text'.match(/\D/g)
//result
(3) ["1", "2", "3"]
(15) [" ", "i", "s", " ", "n", "u", "m", "b", "e", "r", " ", "t", "e", "x", "t"]

\w 영문자, 숫자, _ 문자열을 일치 시킵니다.
\W \w 와 반대 의미입니다.

'Hello world!_# 안녕하세요'.match(/\w/g)
'Hello world!_# 안녕하세요'.match(/\W/g)
(11) ["H", "e", "l", "l", "o", "w", "o", "r", "l", "d", "_"]
(9) [" ", "!", "#", " ", "안", "녕", "하", "세", "요"]

* 앞의 문자가 0개 이상입니다. ```javascript ‘text text1 text2’.match(/text\d/g); ‘text text1 text2’.match(/text\d/g);

‘http://localhost:8080/rex’.match(/(http:\/\/localhost:8080\/rex)(\?[\w|\W]=[\w|\W])$/g); ‘http://localhost:8080/rex?search=한글’.match(/(http:\/\/localhost:8080\/rex)(\?[\w|\W]=[\w|\W])$/g);


```log
//result
["text1", "text2"]
["text", "text1", "text2"]

["http://localhost:8080/rex"]
["http://localhost:8080/rex?search=한글"]

http://localhost:8080/rex 라는 uri가 있다고 가정하겠습니다. 이 uri 에서 /rex, /rex?search=23 와 같은 형태의 uri에 대한 검사를 (\?[\w|\W]*=[\w|\W]*)*$ 표현으로 일치시킵니다.

? 앞의 문자가 0 또는 1개임을 일치시킵니다.

'1234-1234'.match(/^[\d]{4}-?[\d]{4}$/g);
'12341234'.match(/^[\d]{4}-?[\d]{4}$/g);
["1234-1234"]
["12341234"]

8자리의 숫자를 입력받는데 - 의 입력에 대한 허용여부를 판단할수 있습니다.

  • + 앞 문자가 1개 이상입니다.
'success=Y'.match(/^success=[YyNn]+$/g)
'success=y'.match(/^success=[YyNn]+$/g)
'success=N'.match(/^success=[YyNn]+$/g)
'success=n'.match(/^success=[YyNn]+$/g)
'success=a'.match(/^success=[YyNn]+$/g)
["success=Y"]
["success=y"]
["success=n"]
["success=N"]
null

[YyNn]+ 표현식에서 Y, y, N, n 문자에서 한가지 이상 일치해야 문자열을 일치 시킵니다.

{n, m} 앞의 문자가 n번 이상 m번 이하 반복합니다.

'12345'.match(/^[\d]{3,5}$/g)
'1234567'.match(/^[\d]{3,5}$/g)
//result
["12345"]
null

3자리 이상 5자리 이하의 숫자를 일치 시킵니다.

활용

정수여부 판단

/^(([\+|\-]?[1-9]{1}[\d]*)|0)?$/g

Email

// domain, account에 -,_ 특수문자 허용
/^([\w-]+)@([\w]+)(\.[a-zA-Z]+){1,2}$/g

MAC address

/^[0-9a-fA-f]{2}([-:][0-9a-fA-f]{2}){5}$/g

ip

http(s) url

‘localhost:80’.match(/^[\w]+(:[1-9]{1}[\d]{0,4})?$/g)

/^(http(s)?:\/\/(www.)?)([\w]+){1}(\.[a-zA-Z]+){0,2}(:[1-9]{1}[\d]{0,4})?(\/[\w]+|\/)?([\w]+|\/)*(\/[\w]+|\/|[\w]+.[\w]+)?(\?[\w]+=[\w]*(\&[\w]+=[\w]*)*)*$/g

핸드폰 번호

byte 계산

'text'.replace(/[\u0000-\u007f]|([\u0080-\u07ff]|(.))/g,'$&$1$2').length;

정리

문자열의 유효성 검사를위해 정규식을 많이 사용했었습니다.
구글링으로 예제들을 복붙해오는 수준으로 사용을 하고있었는데 정규표현식을 정리하면서 앞으로 간단한 패턴정도는 직접 만들어 쓸수 있을것 같습니다. 추가로 다양한 정규식 패턴들을 활용한 예제들을 포스팅해보겠습니다.

출처