2015년 11월 2일 월요일

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 정규표현식을 이해하기 위한 테스트 클래스
 * . : 임의의 한 문자(필수)를 의미
 * ? : 바로 앞에 문자가 없거나 하나가 있음을 의미
 * * : 바로 앞에 문자가 없거나 하나이상 반복을 의미
 * + : 바로 앞에 문자가 하나 이상 반복을 의미
 * ^ : 문자열의 시작을 의미
 * [^] : ^이후의 괄호안 형식을 제외함을 의미
 * $ : 문자열의 끝을 의미
 * [] : []안의 형식 일치를 의미
 * {} : {}앞 문자열(혹은 문자) 반복 갯수를 의미
 * () : ()안의 내용을 하나의 묶음으로 사용함을 의미
 * | : or 연산을 의미
 * [0-9] : (부터 - 까지)의 숫자를 의미
 * [a-z] : (부터 - 까지)의 소문자를 의미
 * [a-zA-Z] : (부터 - 까지)의 대,소문자를 의미
 * \p(Alpha) : 대,소문자 알파벳을 의미
 * \p(Digit) : 숫자를 의미
 * \p{Alnum} : 대/소문자 알파벳, 숫자를 의미
 * \d : 숫자를 의미
 * \D : 숫자가 아닌 것을 의미
 * \s : 공백 문자를 의미
 * \S : 공백 문자가 아닌 나머지 문자를 의미
 * \w : 알파벳이나 숫자
 * \W : 알파벳이나 숫자를 제외한 문자
 * \ : 정규표현식 역슬래시(\)는 확장 문자. 역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미
 * (?i) : 앞 부분에 (?i)라는 옵션을 넣어주면 대소문자를 구분하지 않음
 *
 * 사용예
 * 1) 숫자만 : ^[0-9]*$
 * 2) 영문자만 : ^[a-zA-Z]*$
 * 3) 한글만 : ^[가-힣]*$
 * 4) 영어 & 숫자만 : ^[a-zA-Z0-9]*$
 * 5) E-Mail : ^[_a-z0-9-]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$            
 * 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})
 *
 */

/** @author
 * 정규표현식 이해를 하기 위해서 만들어 본 클래스입니다.
 * 여기 예제의 대부분은 http://www.java2go.net/java/java_regex.html 에서 참조했습니다.
 * 작성일자 : 2015.11.03
 */
public class RegExTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
RegExTest regExTest = new RegExTest();
regExTest.regEx01();
regExTest.regExMailIDCheck();
regExTest.regEx02();
regExTest.regEx03();
regExTest.regEx04();
regExTest.regEx05();
regExTest.regEx06();
}

/**
* Pattern 객체는 Perl 문법과 비슷한 형태로 정의된 정규표현식을 나타낸다.
* 문자열로 정의한 정규표현식은 사용되기전에 반드시 Pattern클래스의 인스턴스로 컴파일되어야 한다.
* 컴파일된 패턴은 Matcher객체를 만드는데 사용되며, Matcher객체는 임의의 입력문자열이 패턴에 부합되는지 여부를 판가름하는 기능을 담당.
*/
private void regEx01() {
//정규표현식 적용 a로 시작하며, a 다음 아무 문자 1개만, 마지막은 c로 끝남
String regex = "^a.c$";
System.out.println("regEx01-abc : " + "abc".matches(regex)); //true
System.out.println("regEx01-abbc : " + "abbc".matches(regex)); //false
System.out.println("regEx01-a*c : " + "a*c".matches(regex)); //true
System.out.println("regEx01-a1c : " + "a1c".matches(regex)); //true
System.out.println("regEx01-a1cc : " + "a1cc".matches(regex)); //false

Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaaab");
boolean b = m.matches();

if (b) {
System.out.println("match");
} else {
System.out.println("not match");
}
}

//Mail 주소 체크.
private void regExMailIDCheck() {
String regex = "^[_a-z0-9-]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$"; //소문자만 인식
System.out.println("test001@hotmail.com : " + "test001@hotmail.com".matches(regex)); //true
System.out.println("test001@bbb.co.kr : " + "test001@bbb.co.kr".matches(regex)); //true
System.out.println("test001@bbb : " + "test001@bbb".matches(regex)); //false
System.out.println("TEST001@BBB.CO.KR : " + "TEST001@BBB.CO.KR".matches(regex)); //false

regex = "^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@(?:\\w+\\.)+\\w+$"; //대문자도 인식할 수 있도록 변경
System.out.println("test001@hotmail.com : " + "test001@hotmail.com".matches(regex)); //true
System.out.println("test001@bbb.co.kr : " + "test001@bbb.co.kr".matches(regex)); //true
System.out.println("test001@bbb : " + "test001@bbb".matches(regex)); //false
System.out.println("TEST001@BBB.CO.KR : " + "TEST001@BBB.CO.KR".matches(regex)); //true
System.out.println("test001@bbb!.com : " + "test001@bbb!.com".matches(regex)); //false
}

/**
* 문자열 치환하기
* appendReplacement 메소드는 일치하는 패턴이 나타날 때까지의 모든 문자들을 버퍼로 옮기고 찾아진 문자열 대신 교체 문자열로 채워 넣는다.
* appendTail 메소드는 캐릭터 시퀀스의 현재 위치 이후의 문자들을 버퍼에 복사해 넣는다.
*/
private void regEx02() {
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");

StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, "dog");
}
m.appendTail(sb);
System.out.println(sb.toString());
}

/**
* 이메일 주소 유효검사
*/
private boolean isValidEmail(String email) {
Pattern p = Pattern.compile("^(?:\\w+\\.?)*\\w+@(?:\\w+\\.)+\\w+$");
Matcher m = p.matcher(email);
return m.matches();
}

/**
* 이메일 주소 유효성 테스트
*/
private void regEx03() {
String[] emails = {"test@abc.com", "a@.com", "abc@mydomain", "ABC@mydoamin.COM", "chungwan.park@mydomin.co.kr"};

for (int i = 0; i < emails.length; i++) {
if (isValidEmail(emails[i])) {
System.out.println(emails[i]);
}
}
}

/**
* HTML 태그 제거
*/
private String stripHTML(String htmlStr) {
Pattern p = Pattern.compile("<(?:.|\\s)*?>");
Matcher m = p.matcher(htmlStr);
return m.replaceAll("");
}

private void regEx04() {
String htmlStr = "<html><body><h1>Java2go.net</h1> <p>Linuxwan's Personal Workspace...</p></body></html>";
System.out.println(stripHTML(htmlStr));
}

/**
* HTML 링크 만들기
*/
private String linkedText(String sText) {
Pattern p = Pattern.compile("(http|https|ftp)://[^\\s^\\.]+(\\.[^\\s^\\.]+)*");
Matcher m = p.matcher(sText);

StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, "<a href='" + m.group() + "'>" + m.group() + "</a>");
}
m.appendTail(sb);

return sb.toString();
}

private void regEx05() {
String strText = "My linked URL is http://wans-devstory.blogspot.kr/search/label/Android.";
System.out.println(linkedText(strText));
}

/**
* 금지어 필터링 하기
*/
private String filterText(String sText) {
Pattern p = Pattern.compile("fuck|shit|개새끼", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(sText);

StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, maskWord(m.group()));
}
m.appendTail(sb);

return sb.toString();
}

private String maskWord(String word) {
StringBuffer buff = new StringBuffer();
char[] ch = word.toCharArray();
for (int i = 0; i < ch.length; i++) {
if (i < 1) {
buff.append(ch[i]);
} else {
buff.append("*");
}
}
return buff.toString();
}

private void regEx06() {
String sText = "Shit! Read the fucking manual. 개새끼야.";
System.out.println(filterText(sText));
}
}

댓글 없음:

댓글 쓰기