티스토리 뷰
정규표현식 문법
^ : 문자열의 시작을 나타냄.
$ : 문자열의 종료를 나타냄.
. : 임의의 한 문자를 나타냄. (문자의 종류는 가리지 않는다)
| : 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) 로 인해 뒤에 오는 문자의 대소문자를 가리지 않는다.
** 해당 문자 포함 시 무조건 해당 태그 삭제.
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 안에 태그가 들어 있으면 삭제가 되지 않는 듯
'프로그래밍' 카테고리의 다른 글
[ETC] JSTL (0) | 2016.12.24 |
---|---|
[JAVA] JAXBContext로 xml을 오브젝트로, 오브젝트를 xml로 변환하기 (0) | 2016.12.24 |
[JAVASCRIPT] jQuery SelectBox (0) | 2016.12.24 |
[ETC] UNIX 명령어, MSSQL 명령어 (0) | 2016.12.24 |
[ETC] FORMATTER 링크 모음 (0) | 2016.12.24 |
- Total
- Today
- Yesterday
- 족발
- 햄버거
- 아구아스 칼리엔테스
- 쿠스코
- 후마리
- Cusco
- Namibia
- 우유니
- jQuery
- 마추피추
- 성계 투어
- 캄보디아
- 빈트후크
- calama
- 칼라마
- 애드센스
- 킹덤 호텔
- 볼리비아
- 토레스 델 파이네
- 빅토리아폴스
- 성스러운 계곡
- 남미 저가항공
- 나미비아
- Uyuni
- aguas calientes
- 칠레
- Oracle
- Cambodia
- 푸에르토 나탈레스
- 남미
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |