[Java] 자바 #43, 정규표현식 설명 및 예제

정규 표현식

- 정규식

- 패턴에 일치하는 문자열을 검색하는 표현식.


정규 표현식 구성 요소(문법)


1. 모든 문자들

 ex) "a" ->a, "test" -> test


2. 모든 문자(와일드카드)

  - .

  - wildcard(모든 문자)

 ex) "." -> 모든 문자를 검색

 ex) "..." -> 문자3개

 ex) "a.."  -> a다음 문자2개


<앞의 요소의 출연 횟수 지정>


3. 없음

  - 출연 횟수 : 1 ~ 1

  - 생략 불가능, 중복 불가능

  ex)"abc" -> abc

  ex) "ab?cd+e*" -> acddddeeeeeeeeeeeeeeeeeee

 

4. ?

  - 출현 횟수 : 0 ~ 1

  - 생략 가능, 중복 불가능

  ex)"abc" -> abc

  ex)"a?bc" -> bc나 abc를 찾는 표현.

  ex)"홍?길동" -> 안녕하세요. 홍길동입니다. 그냥 길동이라고 불러주세요.

  ex)"(ab)?cd -> cd,abcd/ bcdX

  

 5. +

  - 출현 횟수 : 1 ~ 무한대

  - 생략 불가능, 중복 가능

  ex)"a+bc" -> bc(x) -> abc, aabc, aaaabc, aaaaaaaaaaaaaaabc

  

 6. *

  - 출현 횟수 : 0 ~ 무한대

  - 생략 가능, 중복 가능

  ex)"a*bc" -> bc(x) -> abc, aabc, aaaabc, aaaaaaaaaaaaaaabc

 

 7. {n}

 - 고정 횟수 출현

 - n: 출현횟수

 ex)aaaaabc

 ex)a{5}bc -> aaaaabc

 

 8. {n,}

  - n회 이상 ~ 무한대 출연

  ex) "a{3,}bc"

 

 9. {n,m}

  - n회 이상 ~ m회 이하

  ex) "a{3,8}bc"


10. [요소]

  - choice

  - [ ]안에 나열된 요소 중 하나를 선택

  ex)"[abc]" -> a or b or c -> a,b,c

  ex)"[abc]de"->ade,bde,cde

  ex)"[김이박최정홍]길동" -> 김길동, 이길동, 박길동, 최길동, 정길동, 

  ex)"[김이박최정홍]?길동" -> 길동, 김길동, 이길동

  ex)"[(010)(011)(016)(017)(019)]-4567-8900]" ->010-4567-8900, 011-4567-8900, 016-4567-8900, 02-4567-8900, 017-4567-8900, 019-4567-8900

  

  - 숫자만 검색

ex) "[0123456789]{2,4}"

- 주민번호 검색

: 숫자6자리-숫자7자리

ex) "[0123456789]{6}-[0123456789]{7}"

930101-1010101

- 홀수로만 되어 있는 숫자 검색

ex) "[93751]{2,3}"

- 전화번호(휴대폰) 검색

: 숫자3자리-숫자3~4자리-숫자4자리

ex) "[0123456789]{3}-[0123456789]{3,4}-[0123456789]{4}"

- 영소문자 검색

ex) "[abcdefghijklmnopqrstuvwxyz]{3,10}"

- 영대문자 검색

ex) "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"

- 영어와 숫자의 조합으로만 되어 있는 단어 검색

ex) "[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]{3,10}

   범위 표현( - 하이픈 ) : 중간에 빠진 문자가 없어야 하고, 문자코드값 순서대로 배치

- [0123456789] -> [0-9] (O)

- [012389] -> [0-9] (X)

- [34567] -> [3-7] (O)

- [abcdefghijklmnopqrstuvwxyz] -> [a-z]

- [ABCDEFGHIJKLMNOPQRSTUVWXYZ] -> [A-Z]

- 영어와 숫자의 조합으로만 되어 있는 단어 검색

ex) "[A-Za-z0-9]{3,10}"

- 한글만 검색

ex) "[가-힣]{5}"

- 자바에서 주로 사용하는 식별자를 검색

- 회원 가입 : 아이디 입력

: 영문자 + 숫자 + _

: 4자 ~ 12자 이내

: 숫자로 시작 X

ex) "[A-Za-z_][A-Za-z0-9_]{3,11}"

ex) test123 (O),  hong (O), 123test (X), te (X), hong1234567890 (X),  $hong (X)

 11. 공백

     - \s

     ex)"[홍김박]\s?길동"

        홍길동, 이길동, 박길동, 최길동

        홍 길동, 이 길동, 박 길동, 최 길동

 

  정규표현식 예제 사이트

  regexlib.com

  \w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}

 

  test@test.com


정규표현식을 이용한 예제1


private static String wholeText;

static {

wholeText = "안녕하세요. 저는 홍길동입니다. 나이는 20살입니다. 연락처는 010-9371-5541입니다. 연락이 안되면 010-5435-5467로 연락주세요.";

}

다음과 같이 변수가 선언되어있다면


Pattern p = Pattern.compile("\\d{3}-\\d{4}-\\d{4}"); 정규식 패턴을 담고

Matcher m = p.matcher(wholeText); 


while (m.find()) { 패턴에 맞는 m 매처가 있다면

System.out.println(m.group()); 그것에 접근

}


정규표현식을 이용한 예제2


네이버 시작 페이지 > URL 추출


try {

  String line = "네이버 주소는 http://www.naver.com";

StringBuilder txt = new StringBuilder(line); 

Pattern p = Pattern.compile("(http|ftp|https):\\/\\/[\\w\\-_]

   +(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&amp;:/~\\+#]*[\\w\\-\\@?^=%&amp;/~\\+#])?");

Matcher m = p.matcher(txt.toString());

while (m.find()) {

System.out.println(m.group());

}

} catch (Exception e) {

e.printStackTrace();

}


문자열이 정규식에 해당하는지 여부 ( matches 메소드와 \d)


String str = "정규식123k";

str.matches("[가-힣]{3}\\d{3}[a-z]"); \\붙여주는건 escape역할임


>> \d는 숫자1개를 검사하는 표현식.

>> 성립하면 true 아니면 false 반환.

>> input값이 정규식에 맞는지 아닌지만 판단할 때 편리.


댓글

Designed by JB FACTORY