티스토리 뷰

Programming

[Java] 정규식

noonsong 2018. 6. 12. 00:15


Question :  

"gmail" 메일을 입력한 유저만 필터링 하기 URL

정규식을 사용하여 필터링 하고, Matcher 와 find 메소드를 사용하여 처리. 


Regular Expressions (RegEx) 

Predefined: \ followed by a letter. For example, \d for matching digits (0-9) or \D for matching non-digits. There are also additional predefined character classes that are followed by a set of curly braces, such as \p{Punct} which matches punctuation (i.e.: !"#$%&'()*+,-./:;<=>?@[]^_`{|}~). 


정규표현식, regular expression 

정규 표현식(regular expression, 간단히 regexp 또는 regex)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다


정규식은 특정한 규칙을 가지고있는 문자열의 집합을 표현하는데 사용하는 형식언어이다. 사용 예로 회원가입을 받을때, 전화번호나 이메일 등이 형식에 맞는 input 을 가지고 있는지 검증 할 수 있다. 


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})



출처: http://highcode.tistory.com/6 [HighCode]





Pattern.matches() :  빠르게 어떠한 text(String)이 주어진 Pattern 에 있는지를 확인한다. 


Pattern.compile()  : 여러개의 텍스트를 재사용 가능한 Pattern 인스턴스로 컴파일 한다. 


사용예제 1

boolean latinLettersSearchRegExp(String input) {
 
  return java.util.regex.Pattern.compile("[A-Za-z]").matcher(input).find();
//[A-Z,a-z] also works. 
}
 


사용예제 2

1. Pattern instance 생성 

String regex = "[a-zA-Z]+@+gmail.com";
Pattern p = Pattern.compile(regex);


2. Match instance 생성 - 생성한 패턴(p) 가 일치하는 텍스트만 어레이에 추가

Matcher m = p.matcher(emailID);
if(m.find()) {
                firstnameArr.add(firstName); 
            }


정규표현식 문법 


1) '[]' 특수문자 - 괄호안의 문자 중 일치하는 것을 찾고자 할때 사용한다. 

ex) [abc] -> 일치하는 문자열 : a,b,c, ab, abc.. 

[a-z] -> 소문자가 포함된 모든 문자열

[A-Z] -> 대문자가 포함된 모든 문자열

^[a-zA-Z0-0] -> 숫자와 영문자로 시작되는 모든 문자열 

2) '^' 특수문자 - 문장의 처음을 나타낸다 

*'[]'특수문자 안에서 '^' 특수문자 

[]안의 문자와 일치하지 않는 문자열을 포함하고 있는 패턴을 의미한다 

[^abc]de : .de 패턴과 같고 ade,bde,cde 제외


3)'.'특수문자 

임의의 한 문자를 나타낸다. 

'.'특수문자가 위치한 곳에는 반드시 한 글자가 위치하여야 한다. 

패턴 : 'a.b' : acb, adb, arb .. 

ab. : ab나 abcd는 일치하지 않음


문제 답안 소스코드 


import java.io.*; import java.math.*; import java.security.*; import java.text.*; import java.util.*; import java.util.concurrent.*; import java.util.regex.*; public class Solution { private static final Scanner scanner = new Scanner(System.in); public static void main(String[] args) { int N = scanner.nextInt(); //scanner 에서 입력받은것 중 skip 할 항목들을 정리 scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); // scanner.skip("([a-zA-Z]+\\s[a-zA-Z]+@+[^g])"); String regex = "[a-zA-Z]+@+gmail.com"; Pattern p = Pattern.compile(regex); List<String> firstnameArr = new ArrayList(); int flag=0; for (int NItr = 0; NItr < N; NItr++) { String[] firstNameEmailID = scanner.nextLine().split(" "); String firstName = firstNameEmailID[0]; String emailID = firstNameEmailID[1]; // if(emailID) Matcher m = p.matcher(emailID); if(m.find()) { // System.out.println(firstName); firstnameArr.add(firstName); } } scanner.close(); Collections.sort(firstnameArr); for(int i=0;i<firstnameArr.size();i++){ System.out.println(firstnameArr.get(i)); } } }


정규식 연습할 수 있는 웹사이트

https://www.regexpal.com/ 


'Programming' 카테고리의 다른 글

Maven 용어정리  (0) 2018.06.13
[Java] 정리  (0) 2018.06.13
[Java 문제풀이] LinkedList, removeDuplicate  (0) 2018.05.20
[Java 문제풀이] Binary Numbers  (0) 2018.04.03
[Java] 문자열  (0) 2018.03.30
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함