< 정규 표현식 >
: 복잡한 문자열 패턴을 정의하는 문자 표현 공식 ( => 특정한 규칙을 가진 문자열의 집합을 추출 )
문자 | |
x | 문자 x ( 문자 하나를 의미 ) |
\ \ | 백슬래시(\) 문자 ( 백슬래시 다음에 오는 문자가 특수문자일 경우 그 문자 자체를 의미 ex) in Java \\? → ? (물음표) \\@ → @ (골뱅이) \\^ → ^ (캐럿) \\\\ → \ (백슬래시) \' → ' (작은 따옴표) -- Escape Sequence \" → " (큰 따옴표) -- Escape Sequence ) |
( 이스케이프 시퀀스 ( Escape Sequence ) https://hyunjiishailey.tistory.com/502 )
문자 클래스 | |
[ a b c ] | 문자 a, b, c 중 한 문자 |
[ ^ a b c ] | 문자 a, b, c를 제외한 모든 문자 ( '[ ]' 안에 있는 '^'는 부정( not ) 연산자 ) |
[ a - z A - Z ] | 문자 a ~ z, A ~ Z ( 알파벳 ) ( '-' 는 범위 지정 시 사용 ) |
우선순위 | 이름 | 예시 |
1 | 특수문자 | \ x |
2 | 그룹화 문자 | [ . . . ] |
3 | 범위 | a - z |
4 | 합집합 | [ a - e ] [ i - u ] |
5 | 교집합 | [ a - z && [ a e i o u ] ] |
미리 정의된 문자 클래스 | |
. | 임의의 한 문자 ( 줄바꿈 문자 '\n' 등을 제외한 모든 문자 ) ( [ ] 안에 쓰일 경우 '.' (Dot) 의미 ) |
\ d | 숫자 ( [ 0 - 9 ] 와 같음 ) |
\ D | 숫자가 아닌 문자 ( [ ^ 0 - 9 ] ) |
\ s | 공백 문자 ( [ \ t \ n \ x 0 B \ f \ r ] ) |
\ S | 공백이 아닌 문자 ( [ ^ \ s ] ) |
\ w | 단어 문자 ( [ a - z A - Z _ 0 - 9 ] ) |
\ W | 단어가 아닌 문자 ( [ ^ \ w ] ) |
경계 일치자 | |
^ X | 문자열의 시작 ( 뒤에 올 문자로 시작해야 함 ) |
X $ | 문자열의 끝 ( 앞에 올 문자로 끝나야 함 ) |
수량사 | |
X ? | 0회 또는 1회 ( ex) ab?c ☞ abc, ac 등 ) |
X * | 0회 이상 ( ex) ab* ☞ a, ab, abb, abbb, ... 등 ) |
X + | 1회 이상 ( ex) ab+ ☞ ab, abb, abbb, abbbb, ... 등 ) |
X { n } | n회 |
X { n , } | n회 이상 ( X {0,} = X * ) ( X {1,} = X + ) |
X { , m } | m회 이하 |
X { n , m } | n회 이상 m회 이하 |
X ? ? X * ? X + ? X { n } ? X { n , } ? X { n , m } ? |
가능한 적게 일치 ( 기본적인 수량사는 탐욕적이지만 '?' 문자가 뒤에 붙으면 탐욕적이지 않은 한정사가 됨 ) ( ex) <.*> ☞ <foo><bar>new</bar></foo> <.*?> ☞ <foo> ) |
논리 연산자 | |
X Y | X 다음 Y |
X | Y | X 또는 Y |
( X ) | X 한 그룹 ( 한 그룹으로 인식 ) ( ex) a(bc)* ☞ a, abc, abcbc, ... 등 ) ( ex) a(bc)+ ☞ abc, abcbc, abcbcbc, ... 등 ) |
※ Ref Docs
( https://docs.oracle.com/javase/tutorial/essential/regex/index.html )
( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions )
( https://docs.oracle.com/en/database/oracle/oracle-database/19/adfns/regexp.html#GUID-1935FD80-A3CD-413F-BD2E-BBEFE64000B2 )
( https://www.regular-expressions.info/posixbrackets.html )
< 자바(Java) 예제 >
▶ 문자열에서 조건에 부합하는 부분 대체 ( String.replaceAll() )
String s;
// 공백 제거
s = s.replaceAll(" ", ""); // [way 1]
s = s.replaceAll("\s", ""); // [way 2]
// 알파벳 제거
s = s.replaceAll("[a-zA-Z]", ""); // [way 1]
s = s.toUpperCase().replaceAll("[A-Z]", ""); // [way 2]
// 숫자 제거
s = s.replaceAll("[0-9]", ""); // [way 1]
s = s.replaceAll("\\d", ""); // [way 2]
// 특수문자 제거
s = s.replaceAll("[^a-zA-Z0-9]", ""); // [way 1]
s = s.replaceAll("\\W", ""); // [way 2]
s = s.replaceAll("[^\\w]", ""); // [way 3]
// 여러개의 점을 하나로 대체
s = s.replaceAll("\\.+", "."); // [way 1]
s = s.replaceAll("[.]{2,}", ".") // [way 2]
▶ 문자열에서 조건에 부합하는 부분을 기준으로 나누기 ( String.split() )
String s;
String ss[];
// 한 문자씩 자르기
ss = s.split("");
// 공백 문자를 기준으로 자르기
ss = s.split(" "); // 공백 하나 [way 1]
ss = s.split("\s"); // 공백 하나 [way 2]
ss = s.split("\s+"); // 공백 여러 개
// 기호를 기준으로 자르기
ss = s.split("\\."); // 온점 .
( Java String Class ☞ https://hyunjiishailey.tistory.com/473 )
▶ 문자열이 조건에 부합하는지 유효성 검사 ( Pattern.matches() )
String s;
// 숫자만
Pattern.matches("^[0-9]+$" , s); // 1 (^[0-9]+$)
Pattern.matches("^\\d+$" , s); // 2
// 알파벳만
Pattern.matches("^[a-zA-Z]+$" , s); // 1
Pattern.matches("^[A-Z]+$" , s.toUpperCase); // 2
// 알파벳 대문자만
Pattern.matches("^[A-Z]+$" , s);
// 알파벳 소문자만
Pattern.matches("^[a-z]+$" , s);
// 알파벳과 숫자만
Pattern.matches("^[a-zA-Z0-9]+$" , s); // 1
Pattern.matches("^\\w+$" , s); // 2
// 한글만
Pattern.matches("^[ㄱ-ㅎㅏ-ㅣ가-힇]+$" , s);
// URL
Pattern.matches("(http(s?)://)[a-z0-9.-:#/?]+" , s);
// 이메일
Pattern.matches("^[a-zA-Z0-9]+@[a-zA-Z0-9._-]+$" , s);
// 전화번호
Pattern.matches("^(010)(-?)[0-9]{3,4}(-?)[0-9]{4}$" , s);
// 주민등록번호
Pattern.matches("^[0-9]{6}(-?)[1-4][0-9]{6}$" , s);
▶ 문자열에서 조건에 부합하는 부분만 추출 ( Matcher )
String s, regex;
// ex) 핸드폰 번호 추출
s = "010-1234-5678";
regex = "([0-9]+)-([0-9]+)-([0-9]+)";
Matcher m = Pattern.compile(regex).matcher(s);
m.find();
m.group(0); // 010-1234-5678
m.group(1); // 010
m.group(2); // 1234
m.group(3); // 5678
'프로그래밍 언어 ( Programming Language ) > (공통)' 카테고리의 다른 글
[프로그래밍언어][공통] 아스키( ASCII ) 코드 표 (0) | 2021.12.22 |
---|---|
[프로그래밍언어][공통] 서식 지정자 / 형식 문자(열) ( String Format ) (0) | 2021.12.20 |
[프로그래밍언어][공통] 특수 문자 / 이스케이프 시퀀스 ( Escape Sequence ) / 제어 시퀀스 ( Control Sequence ) (0) | 2021.12.20 |