티스토리 뷰


정규표현식 문법

^ : 문자열의 시작을 나타냄. 

$ : 문자열의 종료를 나타냄. 

. : 임의의 한 문자를 나타냄. (문자의 종류는 가리지 않는다)

| : or를 나타냄. 

? : 앞 문자가 없거나 하나있음을 나타냄. 

+ : 앞 문자가 하나 이상임을 나타냄. 

* : 앞 문자가 없을 수도 무한정 많을 수도 있음을 나타냄. 

[] : 문자 클래스를 지정할 때 사용한다. 문자의 집합이나 범위를 나타내며 두 문자 사이는 '-' 기호로 범위를 나타낸다. 

      []내에서 ^ 가 선행하여 나타나면 not 를 나타낸다. 

{} : 선행문자가 나타나는 횟수 또는 범위를 나타낸다. 

a{3} 인 경우 a가 3번 반복된 경우를 말하며, a{3,}이면 a가 3번 이상 반복인 경우를 말한다. 또한 a{3,5}인 경우 

a가 3번 이상 5번 이하 반복된 경우를 나타낸다. 

( ): 소괄호 ‘( )’ 특수문자는 ‘( )’ 특수문자 안의 글자들을 하나의 문자로 봅니다. 예를 들어 ‘gu(gg){2}le’ 와 같은 패턴을 작성하게 되면    

     ‘guggggle' 문자열이 문자열에 포함되어 있어야 됩니다.

|: 패턴 안에서 OR연산을 사용할 때 사용합니다. 예를 들어 'hi|hello' 는 hi 나 hello 가 포 함되어있는 문자열을 의미합니다.

\w : 알파벳이나 숫자

\W : 알파벳이나 숫자를 제외한 문자

\d : 숫자 [0-9]와 동일

\D : 숫자를 제외한 모든 문자

\: 위의 각 기능에서 벗어납니다(escape).

(?i): 앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않는다 (물음표+소문자i(아이))

 

기본적인 문자열 검증 정규식

 

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

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

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

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

.+ : 한문자 이상의 전체문자를 표시한다.

 

정규식 표현 예제

이메일 : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$  or  ^[_0-9a-zA-Z-]+@[0-9a-zA-Z-]+(.[_0-9a-zA-Z-]+)*$ 

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

일반전화 : ^\d{2,3} - \d{3,4} - \d{4}$

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

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

파일확장자: ([^\s]+(\.(?i)(jpg|png|gif|bmp))$)

 

 

클래스 사용 예.

A typical invocation sequence is thus  

Pattern p = Pattern.compile("a*b"); 

Matcher m = p.matcher("aaaaab"); 

boolean b = m.matches();

 

A matches method is defined by this class as a convenience for when a regular expression is used just once. 

This method compiles an expression and matches an input sequence against it in a single invocation. The statement  

 

boolean b = Pattern.matches("a*b", "aaaaab");

 

 

참고 사이트

자바, javascript, oracle 정규식: http://litlhope.springnote.com/pages/1786498

자바 정규식 간단 설명: http://twinstarbox.tistory.com/entry/Java-%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

URL 정규식으로 분리하기: http://goodidea.tistory.com/86






* 출처

http://nanstrong.tistory.com/entry/java-%EC%A0%95%EA%B7%9C%EC%8B%9D-%EB%AC%B8%EB%B2%95

 

 

 

 

** 출처 : http://ssodang.tistory.com

import java.util.Arrays;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

// TODO IdFormatter? 이름 다시 고민!

public class IdFormatterUtil {

 

private static final Logger logger = LoggerFactory.getLogger(IdFormatterUtil.class);

private static final String PHONE_NUM_PATTERN = "(01[016789])(\\d{3,4})(\\d{4})";

private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"

                                            + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

 

   /**

    * 이메일이든, 휴대폰번호든 각 포맷에 맞게 마스킹된 결과값 리턴해주는 함수

    * 포맷이 맞지 않을 경우 인풋으로 들어온 값 그대로 리턴

    *

    * public은 이거 하나! valid check류의 메서드들도 추후 필요하면 public으로 바꿀 예정

    *

    * @param id

    * @return maskedId

    */

   public static String getMaskedId(String id) {

      if (isEmail(id)) {

         return getMaskedEmail(id);

      } else if (isPhoneNum(id)) {

         return getMaskedPhoneNum(id);

      }

      return id;

   }

 

   /**

    * 이메일 포맷 Validator

    * @param str

    * @return isValidEmailFormat

    */

   private static boolean isEmail(final String str) {

      return isValid(EMAIL_PATTERN, str);

   }

 

   /**

    * 휴대폰 번호 포맷 Validator

    * @param str

    * @return isValidCellPhoneNumFormat

    */

   private static boolean isPhoneNum(final String str) {

      return isValid(PHONE_NUM_PATTERN, str);

   }

 

   /**

    * 문자열이 정규식에 맞는 포맷인지 체크

    * @param regex

    * @param target

    * @return isValid

    */

   private static boolean isValid(final String regex, final String target) {

      Matcher matcher = Pattern.compile(regex).matcher(target);

      return matcher.matches();

   }

 

   /**

    * 이메일 주소 마스킹 처리

    * @param email

    * @return maskedEmailAddress

    */

   private static String getMaskedEmail(String email) {

      /*

      * 요구되는 메일 포맷

      * {userId}@domain.com

      * */

      String regex = "\\b(\\S+)+@(\\S+.\\S+)";

      Matcher matcher = Pattern.compile(regex).matcher(email);

      if (matcher.find()) {

         String id = matcher.group(1); // 마스킹 처리할 부분인 userId

         /*

         * userId의 길이를 기준으로 세글자 초과인 경우 뒤 세자리를 마스킹 처리하고,

         * 세글자인 경우 뒤 두글자만 마스킹,

         * 세글자 미만인 경우 모두 마스킹 처리

         */

         int length = id.length();

         if (length < 3) {

            char[] c = new char[length];

            Arrays.fill(c, '*');

            return email.replace(id, String.valueOf(c));

         } else if (length == 3) {

            return email.replaceAll("\\b(\\S+)[^@][^@]+@(\\S+)", "$1**@$2");

         } else {

            return email.replaceAll("\\b(\\S+)[^@][^@][^@]+@(\\S+)", "$1***@$2");

         }

      }

      return email;

   }

 

   /**

    * 휴대폰 번호 마스킹 처리

    * @param phoneNum

    * @return maskedCellPhoneNumber

    */

   private static String getMaskedPhoneNum(String phoneNum) {

      /*

      * 요구되는 휴대폰 번호 포맷

      * 01055557777 또는 0113339999 로 010+네자리+네자리 또는 011~019+세자리+네자리 이!지!만!

      * 사실 0107770000 과 01188884444 같이 가운데 번호는 3자리 또는 4자리면 돈케어

      * */

      String regex = "(01[016789])(\\d{3,4})\\d{4}$";

      Matcher matcher = Pattern.compile(regex).matcher(phoneNum);

      if (matcher.find()) {

         String replaceTarget = matcher.group(2);

         char[] c = new char[replaceTarget.length()];

         Arrays.fill(c, '*');

         return phoneNum.replace(replaceTarget, String.valueOf(c));

      }

      return phoneNum;

   }

 


** HTML 태그 제거 관련 예제

예제1)

String info = "<span style='font-weight:bold;'>테스트글<br></span><span style='COLOR: #000000'><span style='COLOR: #000000'><strong>* 기간<br>* 기간 : 2099/01/01 ~ 2999/12/31<br></strong></span><br>* 혜택 → 좋은 혜택제공<br><span style='COLOR: #0000ff'>※ 즐거운 하루 <br>안녕하세요. </span><br>★ 음료수는 5천원<br><br>* 2명 이상 무료<br>- 무료간식제공(12:00pm~15:00pm)<br>- 점심 서비스(12:30pm~14:00pm)<br>- <br>- 음료2인 무료<br><br>- 쿠키 무료<br><br><span style='COLOR: #ff0000'><strong>과자<br></strong>→ 치토스, 꼬깔콘</span><br><br><strong>판매기간<br></strong>- 기간 : 2016-01-01 (월) 까지<br>- 장소 : 크로아티아 (한국에서 비행기 13시간 거리 위치)<br>- 운영시간 : 주말 09:00am ~ 08:00pm <br><br><br>";

 

1-1. HTML 태그 모두 삭제

REPLACE : info.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "");

--> 테스트글* 기간* 기간 : 2099/01/01 ~ 2999/12/31* 혜택 → 좋은 혜택제공※ 즐거운 하루 안녕하세요. ★ 음료수는 5천원* 2명 이상 무료- 무료간식제공(12:00pm~15:00pm)- 점심 서비스(12:30pm~14:00pm)- - 음료2인 무료- 쿠키 무료과자→ 치토스, 꼬깔콘판매기간- 기간 : 2016-01-01 (월) 까지- 장소 : 크로아티아 (한국에서 비행기 13시간 거리 위치)- 운영시간 : 주말 09:00am ~ 08:00pm

 

1-2. SPAN 태그만 삭제 ( span 아래의 a 태그도 삭제된다. ex) <span><a><strong>String</strong></a></span> --> <strong>String</strong>

REPLACE : info.replaceAll("<(/)?((?i)(span|a))(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "");

--> 테스트글<br><strong>* 기간<br>* 기간 : 2099/01/01 ~ 2999/12/31<br></strong><br>* 혜택 → 좋은 혜택제공<br>※ 즐거운 하루 <br>안녕하세요. <br>★ 음료수는 5천원<br><br>* 2명 이상 무료<br>- 무료간식제공(12:00pm~15:00pm)<br>- 점심 서비스(12:30pm~14:00pm)<br>- <br>- 음료2인 무료<br><br>- 쿠키 무료<br><br><strong>과자<br></strong>→ 치토스, 꼬깔콘<br><br><strong>판매기간<br></strong>- 기간 : 2016-01-01 (월) 까지<br>- 장소 : 크로아티아 (한국에서 비행기 13시간 거리 위치)<br>- 운영시간 : 주말 09:00am ~ 08:00pm <br><br><br>

 

1-3. <BR> 이 1개 이상 연속 반복 시 1개의 <BR> 만 남기기

REPLACE : info.replaceAll("(<(?i)br[^>]*>){2,10}", "<br>");

--> <span style='font-weight:bold;'>테스트글<br></span><span style='COLOR: #000000'><span style='COLOR: #000000'><strong>* 기간<br>* 기간 : 2099/01/01 ~ 2999/12/31<br></strong></span><br>* 혜택 → 좋은 혜택제공<br><span style='COLOR: #0000ff'>※ 즐거운 하루 <br>안녕하세요. </span><br>★ 음료수는 5천원<br>* 2명 이상 무료<br>- 무료간식제공(12:00pm~15:00pm)<br>- 점심 서비스(12:30pm~14:00pm)<br>- <br>- 음료2인 무료<br>- 쿠키 무료<br><span style='COLOR: #ff0000'><strong>과자<br></strong>→ 치토스, 꼬깔콘</span><br><strong>판매기간<br></strong>- 기간 : 2016-01-01 (월) 까지<br>- 장소 : 크로아티아 (한국에서 비행기 13시간 거리 위치)<br>- 운영시간 : 주말 09:00am ~ 08:00pm <br>


 

예제2)

String urls = "<span style='color: #ff0000'><a href='mailto:letusgo@tistory.com'><strong>letusgo</strong></a></span><br />";

 

2-1. HTML 태그 모두 삭제

REPLACE : urls.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "");

--> letusgo

 

2-2. A 태그만 삭제

REPLACE : urls.replaceAll("<(/)?((?i)(a))(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "");

--> <span style='color: #ff0000'><strong>letusgo</strong></span><br />


2-3. SPAN, A 태그 삭제 **

REPLACE : urls.replaceAll("<(/)?((?i)(span|a))(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "");

--> <strong>letusgo</strong><br />

 ** 1-2. 1-3, 2-2, 2-3 의 경우 (?i) 로 인해 뒤에 오는 문자의 대소문자를 가리지 않는다.


********** 특정 태그 삭제 한방에 하기 :: 삭제를 원하는 태그를 | 로 구분하여 넣는다.
REPLACE : info.replaceAll("</?(?i:span|br|style|iframe)(.|\n)*?>", ""));
--> 테스트글<strong>* 기간* 기간 : 2099/01/01 ~ 2999/12/31</strong>* 혜택 → 좋은 혜택제공※ 즐거운 하루 안녕하세요. ★ 음료수는 5천원* 2명 이상 무료- 무료간식제공(12:00pm~15:00pm)- 점심 서비스(12:30pm~14:00pm)- - 음료2인 무료- 쿠키 무료<strong>과자</strong>→ 치토스, 꼬깔콘<strong>판매기간</strong>- 기간 : 2016-01-01 (월) 까지- 장소 : 크로아티아 (한국에서 비행기 13시간 거리 위치)- 운영시간 : 주말 09:00am ~ 08:00pm 


** 특정 문자 무조건 삭제 : 구분자 | 로 삭제할 문자를 정한다.
String teststr = "<SCRIPT type=\"text/javascript\">alert('aa');</script>alert|<confirm>|prompt|[expression]|eval|onclick|onerror|onload";
REPLACE :: teststr.replaceAll("(?i:alert|vbscript|confirm|prompt|expression|eval|onclick|onError|onload)", "");
--> <SCRIPT type="text/javascript">('aa');</script>|<>||[]||||


** 해당 문자 포함 시 무조건 해당 태그 삭제.

String teststr = "<span style=\"font-weight:bold;\">.   포함사항<br></span><td>aaa</td><iframe>http://naver.com</iframe>";


System.out.println(teststr.replaceAll("(?i)\\<(\\s*/?(a|h\\d|b|i|em|cite|code|strong|pre|br).*?/?)\\>", ""));

-><span style="font-weight:bold;">.   포함사항</span><td>aaa</td>http://naver.com


System.out.println(teststr.replaceAll("(?i)\\<(\\s*/?(s|t|i).*?/?)\\>", ""));

->.   포함사항<br>aaahttp://naver.com


System.out.println(teststr.replaceAll("(?i)\\<(\\s*/?(s|t|iframes).*?/?)\\>", ""));

->.   포함사항<br>aaa<iframe>http://naver.com</iframe>


--> 괄호안에 있는 문자가 들어가면 무조건 해당 태그 삭제. 풀매칭하기 때문에 iframes 라고 하면 못찾으므로 iframe 은 살아있다.




** 그 외 ....

System.out.println(teststr.replaceAll("<iframe>(.*?)</iframe>", ""));

-> <span style="font-weight:bold;">.   포함사항<br></span><td>aaa</td>

--> iframe 태그부터 해당 태그 안의 문장까지 모두 삭제


System.out.println(teststr.replaceAll("<span>(.*?)</span>", ""));

-> <span style="font-weight:bold;">.   포함사항<br></span><td>aaa</td><iframe>http://naver.com</iframe>

--> 바로 위의 iframe 은 모두 삭제 되었으나 span 안에 태그가 들어 있으면 삭제가 되지 않는 듯

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함