안녕하세요. 이번시간에는 javascript에 Regex 정규 표현식에 대해 알아보겠습니다.
정규표현식은 우리가 개발 시에 옵션을 주기위해서 사용하기 정말 좋은 언어인데요 저도 개발중에 이 표현식을 알게되서
로그인 방식설정에 큰 도움이 되었습니다.
1. 정규 표현식이란 ??
- 정규 표현식이란 문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 "검색"하거나 "치환" 하는 과정을 매우 간편하게 처리하는 수단 중 하나 입니다.
1-1. 정규 표현식의 용어들
일단 주요 사용 예부터 설명드리자면
표현식 | 의미 |
^x | 문자열의 시작 표현하며 x 문자로 시작됨을 의미합니다. (즉 처음 문자열의 시작은 x문자다) |
x$ | 문자열의 종료를 표현하며 x문자로 종료됨을 의미합니다. |
.x | 임의의 한 문자의 자리수를 표현하며 문자열이 x로 끝난다는 것을 의미합니다. |
x+ | 반복을 표현하며 x문자가 한번 이상 반복됨을 의미합니다. |
x? | 존재여부를 표현하며 x문자가 존재할 수도, 존재하지 않을 수도 있음을 의미합니다. |
x* | 반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미한다. |
x|y | or 를 표현하며 x 또는 y 문자가 존재함을 의미한다. |
(x) | 그룹을 표현하며 x를 그룹으로 처리함을 의미합니다. |
(x)(y) | 그룹들의 집합을 표현하며 앞에서 부터 순서대로 번호를 부여하여 관리하고 x, y 는 각 그룹의 데이터로 관리된다. |
(x)(?:y) | 그룹들의 집합에 대한 예외를 표현하며 그룹 집합으로 관리되지 않음을 의미한다. |
x{n} | 반복을 표현하며 x 문자가 n번 이상 반복됨을 의미한다. |
x{n,} | 반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미한다. |
x{n,m} | 반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미한다. |
Meta 문자들 중에서 좀 더 특수하게 사용되는 문자들이 존재합니다. '[]'는 내부에 지정된 문자열 범위 중에서 한 문자만을 선택한다는 특수한 의미를 가집니다. 그리고 내부에서 Meta문자를 사용하면 다른 의미를 가지고 동작할 수 있으므로 잘 확인 후 사용해야 합니다. 좀 더 특별한 용도로 사용되는 것들은 아래의 표와 같습니다.
flag | 의미 |
g | Global을 표현하며 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다. |
i | Ignore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다. |
m | Multi line을 표현하며 대상 문자열이 다중 라인의 문자열일 경우에도 검색하는 것을 의미한다. |
사용 예제
개별 숫자- /[0-9]/g
-전체에서 0~9사이에 아무숫자 '하나'를 찾음
개별 문자 - /[to]/g
-전체에서 t혹은 o를 모두 찾음
단어 - /filter/g
- 전체에서 f 따로 i따로 찾는게 아닌 'filter' 라는 단어에 매칭되는 것을 찾음
단어 제외- /\b(?:(?!to)\w)+\b/g
- 전체에서 'to'라는 단어를 빼고 다른 단어 매칭 / 확인 결과 "Tutorial"도 제외
단어 제외 - \b(?!\bto\b)\w+\b
-전체에에서 "to"라는 단어는 빼고 다른 단어 매칭 / 확인 결과 "Tutorial"는 제외 안됨. 이것이 더 정확 하다고 볼 수 있음
\b # assert at a word boundary (?! # look ahead and assert that what follows IS NOT... \b # a word boundary word # followed by the exact characters `word` \b # followed by a word boundary ) # end look-ahead assertion \w+ # match one or more word characters: `[a-zA-Z0-9_]` \b # then a word boundary
출처: https://hamait.tistory.com/342 [HAMA 블로그]
이메일 - //^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
'시작을' 0~9 사이 숫자 or a-z A-Z 알파벳 아무것으로 시작하고 / 중간에 - _. 같은 문자가 있을 수도 있고 없을 수도 있으며 /
그 후에 0~9 사이 숫자 or a-z A-Z 알파벳중 하나의 문자가 없거나 연달아 나올 수 있으며 / @ 가 반드시 존재하고 /
0-9a-zA-Z 여기서 하나가 있고 / 중간에 -_. 같은 문자가 있을수 있고 없을수 있으며 / 그 후에 0~9 사이 숫자 or
a-z A-Z 알파벳중 하나의
문자가 없거나 연달아 나올 수 있으며 / 반드시 . 이 존재하고 / [a-zA-Z] 의 문자가 2개나 3개가 존재 / 이 모든것은 대소문자를 구분 안함
전화번호 - /^\d{3}-\d{3,4}-\d{4}$/
시작을 숫자 3개로 하며 / 중간에 하이픈 - 하나 존재 / 숫자가 3~4개가 존재하며 / 하이픈 하나 존재 / 숫자 4개로 끝남
핸드폰 번호 -/^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/
시작을 숫자 01로 시작하며 그 후에 0,1,6,7,8,9 중에 하나가 나올수도 있으며 / 하이픈 - 하나 존재할 수도 있고 / 숫자 3~4개가 이어지고 /
또 하이픈 - 하나 존재할 수도 있으며 / 숫자 4개가 이어짐
URL - ^(https?):\/\/([^:\/\s]+)(:([^\/]*))?((\/[^\s/\/]+)*)?\/?([^#\s\?]*)(\?([^#\s]*))?(#(\w*))?$
^(https?):\/\/
([^:\/\s]+)
(:([^\/]*))?
((\/[^\s/\/]+)*)?\/?([^#\s\?]*)(\?([^#\s]*))?(#(\w*))?$
래퍼런스 : https://stackoverflow.com/questions/7820930/regex-how-to-exclude-single-word
참고 자료