WEB개발/JS&HTML

[JS, JAVA] 정규식

wooyeon06 2022. 6. 13. 14:21

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

 

^ 문자열의 시작
$ 문자열의 끝
. 임의의 한 문자
* 문자가 0번 이상 발생
+ 문자가 1번 이상 발생
? 문자가 0번 혹은 1번 발생
[ ]  문자의 집합 범위를 나타냄
[0-9] : 숫자 (0부터 9)
[a-z] : 알파벳 (a부터 z)

앞에 ^가 나타나면 not을 의미
{ }  횟수 또는 범위를 의미
( )  소괄호 안의 문자를 하나의 문자로 인식
|  or 조건
\ 확장 문자의 시작 
\b 단어의 경계
\B 단어가 아닌 것의 경계
\A 입력의 시작부분
\G 이전 매치의 끝
\Z 입력의 끝이지만 종결자가 있는 경우
\z 입력의 끝
\s 공백문자
\S 공백문자가 아닌 나머지 문자
\w 알파벳이나 숫자
\W 알파벳이나 숫자를 제외한 문자
\d [0-9]와 동일
\D 숫자를 제외한 모든 문자
(?:) 캡처(Capture)하지 않는 그룹

 

 

자주 사용하는 정규식모음

 

한글, 숫자, 영문 ^[가-힣0-9a-zA-Z]*$
이메일 기본체크: /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/

RFC5322: /\b[\w.!#$%&’*+\/=?^`{|}~-]+@[\w-]+(?:\.[\w-]+)*\b/

전자우편 주소: /^[a-z0-9_+.-]+@([a-z0-9-]+\.)+[a-z0-9]{2,4}$/ 

정밀체크 : /(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/
특수문자 [^가-힣0-9a-zA-Z]
휴대전화번호 3자리-3~4자리-4자리(사이에 1자 아무거나 가능)): /^[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3,4}[-\s\.]?[0-9]{4}$/

3자리-3~4자리-4자리(사이에 "-" 고정): /^\d{3}-\d{3,4}-\d{4}$/

휴대폰&전화번호: /(^02.{0}|^01.{1}|[0-9]{3})([0-9]+)([0-9]{4})/

휴대폰번호: /^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$/
신용카드번호 19자리 숫자와 "-": /^[0-9-]{19}$/

4-4-4-4 체크: /^[0-9]{4}[-\s\.]?[0-9]{4}[-\s\.]?[0-9]{4}[-\s\.]?[0-9]{4}$/
아스키II 코드만 /[ -~]/
UUID /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/
맥어드레스 /^[a-fA-F0-9]{2}(:[a-fA-F0-9]{2}){5}$/
IP주소(IPv4) /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/
IP주소(IPv6) /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/
URL 프로토콜 포함: /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#()?&//=]*)/ 

프로토콜 옵션: /(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/ 
HTML 태그 /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/

/<\/?[\w\s]*>|<.+[\W]>/

/<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)/
년월일 yyyy-mm-dd: /^(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$/
주민등록번호 /^[-A-Za-z0-9_]+[-A-Za-z0-9_.]*[@]{1}[-A-Za-z0-9_]+[-A-Za-z0-9_.]*[.]{1}[A-Za-z]{1,5}$/
확장자체크 /([^\s]+(?=\.(jpg|gif|png))\.\2)/

 

 

JAVA

 

find() : 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동(여러개가 매칭되는 경우 반복 실행가능)
find(int start) : start위치 이후부터 매칭검색을 수행
start() : 매칭되는 문자열 시작위치 반환
start(int group) : 지정된 그룹이 매칭되는 시작위치 반환
end() : 매칭되는  문자열 끝 다음 문자위치 반환
end(int group) : 지정되 그룹이 매칭되는 끝 다음 문자위치 반환

group() : 매칭된 부분을 반환
group(int group) : 매칭된 부분중 group번 그룹핑 매칭부분 반환
groupCount() : 패턴내 그룹핑한(괄호지정) 전체 갯수 반환
matches() : 패턴이 전체 문자열과 일치할 경우 true 반환

 

String line = "aaaaaaaaa1234bbbbbbbb";
String pattern = "(.*)([0-9]{3,})(.*)";

Pattern r = Pattern.compile(pattern);

Matcher m = r.matcher(line);
	      
while (m.find()) {
	System.out.println(m.group(0));
	System.out.println(m.group(1));
	System.out.println(m.group(2));
	System.out.println(m.group(3));
}

 

aaaaaaaaa1234bbbbbbbb  (0 전체)
aaaaaaaaa1   (1번째 그룹)
234  (2번째 그룹)
bbbbbbbb  (3번째 그룹)

 

 

String line = "wooyeo   n0111123333333333333333333333333333333333333333111111111111116@gmail.com";
String pattern = "[^가-힣0-9a-zA-Z]";

Pattern p = Pattern.compile(pattern);
	      
Matcher m = p.matcher(line);
	      
while(m.find()) {
	System.out.println(line.substring(m.start(), m.end()));
}

 

 
 

 

Javascript

 

exec() : 문자열에서 일치하는 부분을 탐색합니다. 일치 정보를 나타내는 배열, 또는 일치가 없는 경우 null을 반환합니다.

test() : 문자열에 일치하는 부분이 있는지 확인합니다. true 또는 false를 반환합니다.

match() : 캡처 그룹을 포함해서 모든 일치를 담은 배열을 반환합니다. 일치가 없으면 null을 반환합니다.

search() :  문자열에서 일치하는 부분을 탐색합니다. 일치하는 부분의 인덱스, 또는 일치가 없는 경우 -1을 반환합니다

 

 

플래그를 활용한 고급 탐색

   
d 부분 문자열 일치에 대해 인덱스 생성.
g 전역 탐색.
i 대소문자를 구분하지 않음.
m 여러 줄에 걸쳐 탐색.
s 개행 문자가 .과 일치함.
u "unicode", 패턴을 유니코드 코드 포인트의 시퀀스로 간주함.
y "접착" 탐색, 대상 문자열의 현재 위치에서 탐색을 시작함. sticky (en-US)를 참고하세요.

 

const regex = /hello/;
const str = 'hello world';
console.log(regex.test(str)); // true

 

const regex = /hello/;
const str = 'hello world';
const result = regex.exec(str);
console.log(result); // ["hello"]
console.log(result.index); // 0 (매치된 문자열의 시작 인덱스)
console.log(result.input); // "hello world" (원본 문자열)

 

const str = 'hello world hello';
const result = str.match(/hello/g); // 'g' 플래그로 모든 매치를 찾음
console.log(result); // ["hello", "hello"]

 

 

 

 


참조

https://hbase.tistory.com/160

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions