정규 표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식언어 입니다.
정규 표현식 정리
정규 표현식 메타문자
일정한 의미를 가지고 쓰는 특수문자를 메타문자라고 합니다.
.
[]
^
$
{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
// 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;
정리
문자열의 유효성 검사를위해 정규식을 많이 사용했었습니다.
구글링으로 예제들을 복붙해오는 수준으로 사용을 하고있었는데 정규표현식을 정리하면서 앞으로 간단한 패턴정도는 직접 만들어 쓸수 있을것 같습니다.
추가로 다양한 정규식 패턴들을 활용한 예제들을 포스팅해보겠습니다.