1 a n G u a g e /JAVA

[Java] 정규식 표현 (Regular Expression)

동혼 2020. 4. 20. 16:40

 

정규식 의미 

- 복잡한 문자열 패턴을 정의하는 문자표현 공식

- 정규표현식, regexp 또는 regex등으로 불림

- 특정한 규칙을 가진 문자열의 집합을 추출

 

정규식 사용 이유

* 텍스트 검색과 치환의  효과성

-조건절 처리없이 문자열 조작 가능

-모든 종류의 텍스트 강력한 처리 조작(검색, 치환)

-데이터 parsing시 빠른 코딩

*대부분의 컴퓨터 언어 지원 (확장성) 

 

 

## 배경

Web Project를 진행하면 Client에게서 어떠한 정보가 입력될지 모르기에, 이 정보를 정규화하는 과정이 필요합니다. 이를 유효성 검사라고 하는데 유효성검사를 제대로 하지않으면, 데이터의 신뢰도가 떨어지게 되고, 예기치 않은 에러를 발생시키기 때문입니다. 이를 위해서는 각 언어마다 정규표현식을 제공해주고 있으며, 크게 다르지 않습니다.

 

정규식 사용 예

- 택스트 처리 작업

- 데이터 검증 ( 주민번호, 휴대폰 번호 등)

 

 

 

 

정규식 메서드 (자바 문자열 객체(java.lang.String))

boolean matches(String regex)

  인자로 주어진 정규식에 매칭되는 값이 있는지 확인합니다.

 

String replaceAll(String regex, String replacement)

  문자열내에 있는 정규식 regex와 매치되는 모든 문자열을 replacement문자열로 바꾼 문자열을 반환합니다.

 

String[] split(String regex)

  인자로 주어진 정규식과 매치되는 문자열을 구분자로 분할합니다.

 

 

정규식 객체 (  java.util.regex 패키지 )

Pattern 객체

  정규식의 컴파일된 표현 입니다(정규식을 적용 가능하도록 컴파일해서 가지고 있습니다).

  Pattern 클래스는 공개된 생성자를 제공하지 않습니다.

  패턴을 생성하려면 Pattern객체를 반환하는 정적 compile 메소드를 호출해야 합니다.

  이 메소드는 첫 번째 인자로 정규식 문자열을 받아 들입니다.

 

Matcher 객체

  패턴을 해석하고 입력 문자열에 대해 일치 작업을 수행하는 엔진입니다.

  Pattern 클래스와 마찬가지로 Matcher는 어떤 공개된 생성자도 정의하고 있지 않습니다.

  Matcher객체는 Pattern 객체의 matcher 메소드를 호출해서 얻습니다.

 

PatternSyntaxException 객체

  정규식 패턴의 문법 오류를 나타내는 unchecked 예외 입니다.

 

 

 

문법 

^ 문자열 시작
$ 문자열 종료
. 임의의 문자 [단 ‘'는 넣을 수 없습니다.]
* 앞 문자가 0개 이상의 개수가 존재할 수 있습니다.
+ 앞 문자가 1개 이상의 개수가 존재할 수 있습니다.
? 앞 문자가 없거나 하나 있을 수 있습니다.
[] 문자의 집합이나 범위를 표현합니다. -기호를 통해 범위를 나타낼 수 있습니다. ^가 존재하면 not을 나타냅니다.
{} 횟수 또는 범위를 나타냅니다.
() 괄호안의 문자를 하나의 문자로 인식합니다.
| 패턴을 OR 연산을 수행할 때 사용합니다.
\s 공백 문자
\S 공백 문자가 아닌 나머지 문자
\w 알파벳이나 문자
\W 알파벳이나 숫자를 제외한 문자
\d [0-9] 숫자
\D 숫자를 제외한 모든 문자
(?i) 대소문자를 구분하지 않습니다.

 

 

정규식에 사용되는 메타문자의 사용법

 

 

기본패턴틀

 

 

 

 

 

1. 자주 쓰이는 패턴

 

1) 숫자만 : ^[0-9]*$

2) 영문자만 : ^[a-zA-Z]*$

3) 한글만 : ^[가-힣]*$

4) 영어 & 숫자만 : ^[a-zA-Z0-9]*$

5) E-Mail : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$

6) 휴대폰 : ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$

7) 일반전화 : ^\d{2.3} - \d{3,4} - \d{4}$

8) 주민등록번호 : \d{6} \- [1-4]\d{6}

9) IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})

 


2. 분석

  • ^ : 문자열 시작을 알립니다.
  • [ ] : 안에 정해진 문자형식범위를 나타냅니다. 대괄호 안에 ^있으면 not을 나타냅니다.
    ex) ^[^a-zA-z]*$ 를 입력하면 영어는 아닌 문자를 의미합니다.
  • ( ) : 하나의 문자로 취급합니다. 
    ex) (abc) 패턴일 경우 : abc외에는 모두 false처리 됩니다. (abc)* 의 경우 abc의 반복을 제외하고 모두 false처리됩니다.
  • { } : 횟수 또는 길이를 나타내어줍니다.
  •  * : 이전 문자의 갯수의 제한을 두지 않습니다. *를 입력하지 않으면 개수를 1개로 인정하고 조건이 맞아도 문자 길이가 1를 넘어가면 false를 반환합니다.
  • + : 앞에 있는 정규식 형식이 1개가 꼭 들어가야 한다는 의미입니다..
  • \\d : \를 2개 붙이는 이유는 "\\d" 문자 안에서 \ 다음 \문자가 특수문자라고 알려주는 것과 같습니다. 이 형식을 사용하면 숫자만 true를 반환합니다.
    ex) ^[a-zA-Z]+\\d{2} 는 어떠한 값이 true를 반환할까?
    => ^시작열을 알리기에 앞에 a~Z까지 +로 인해 문자가 꼭 1개 들어가야 합니다.. 그리고 숫자 2개를 포함한다라고 해석 할 수 있습니다.

 

 

 

-------------- 사용 예 -------------- 

TB_ 로 시작하는 테이블명만 추출 

 

사이트 :  https://regexr.com/

 

 

(?=TB_.)+[A-z]\w* 설명 

 

 

(?=TB_.)             = 후방검색 , TB_ 이후 모든 글자 검색

[A-z]\w*          = [A-z] ,   A부터 z까지 검색 (대소문자 포함검색)

                         \w  ,   알파벳이나 문자 (특수문자  [ 괄호 등 ] 제외 )

                        * or + ,  *-> 0개이상, + -> 1개이상 매칭 

 

-------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- 

 

 

 

 

 

 

 

-------------- 상세 예 -------------- 

 

1. 매칭될 문자를 지정하거나, 제외하는 방법입니다.

 

정규식설명

[abc] a, b, c중 하나이면 일치 합니다.
[^abc] a, b, c를 제외한 다른 글자 이면 일치합니다.
[a-zA-Z] a 부터 z까지의 소문자 알파벳 이거나 A 부터 Z까지의 대문자 알파벳 중의 하나라면 일치합니다.(범위)
[a-d[m-p]] a 부터 d까지, 또는 m 부터 p까지 중에 하나와 일치합니다: [a-dm-p] (합집합)
[a-z&&[def]] d, e, f 중의 하나와 일치합니다. (교집합)
[a-z&&[^bc]] b와 c를 제외한 a 부터 z까지 중의 하나와 일치합니다: [ad-z] (차집합)
[a-z&&[^m-p]] m부터 p 까지를 제외한, a 부터 z까지 중의 하나와 일치합니다: [a-lq-z] (차집합)

 

 

2. 미리 정의된 문자를 지정하는 방법입니다.

 

정규식설명

. 임의의 문자 (라인 종결자와 일치할 수도 하지 않을 수도 있음)
\d 숫자 문자: [0-9]
\D 숫자 문자가 아닌것: [^0-9]
\s 화이트 스페이스 문자: [ \t\n\x0B\f\r]
\S 화이트 스페이스 문자가 아닌것: [^\s]
\w 알파벳 단어 문자(word 문자): [a-zA-Z_0-9]
\W 알파벳 단어 문자가 아닌것: [^\w]

 

 

3. 수량 매칭

 

패턴이 나오는 횟수를 지정할 수 있습니다.

 

GreedyReluctantPossessive의미

X? X?? X?+ X가 없거나 한번 나옴
X* X*? X*+ X가 없거나 한번 이상 나옴
X+ X+? X++ X가 한번 또는 여러번 나옴
X{n} X{n}? X{n}+

X가 정확히 n번 나옴

X{n,} X{n,}? X{n,}+ X가 n번 이상 나옴
X{n,m} X{n,m}? X{n,m}+ X가 n이상 m이하로 나옴

 

 

 

 

-------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

============참조

 


 

 

 

정규표현식 _기본틀 

https://jamesdreaming.tistory.com/179

메서드 , 객체 

https://offbyone.tistory.com/400 [쉬고 싶은 개발자]

 

 https://postitforhooney.tistory.com/entry/JavaRegex-자바-정규표현식에-대해서-공부하고-예제-만들기 [PostIT]

 

http://pupustory.tistory.com/132

 

 

다음에 연습해볼 예제

https://m.blog.naver.com/bb_/220863282423

Matcher, Pattern, find(), group()

https://offbyone.tistory.com/400 전체 설명 ( 완독 필수 )