티스토리 뷰
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 |