[JAVA] 정규표현식
#정규표현식이란
문자열에 정해진 문자열만 포함되어 있는가 검사해서 True, False로 결과를 반환하는 것
#정규표현식 작성 방법
문자 인코딩에 따라 조금씩 다르다
^ |
문자열의 시작 |
$ |
문자열의 종료 |
. |
임의의 한 문자 (문자의 종류 가리지 않음) 단, \ 는 넣을 수 없음 |
* |
앞 문자가 없을 수도 무한정 많을 수도 있음 |
+ |
앞 문자가 하나 이상 |
? |
앞 문자가 없거나 하나있음 |
[] |
문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다. |
{} |
횟수 또는 범위를 나타낸다. |
() |
소괄호 안의 문자를 하나의 문자로 인식 |
| |
패턴 안에서 or 연산을 수행할 때 사용 |
\s |
공백 문자 |
\S |
공백 문자가 아닌 나머지 문자 |
\w |
알파벳이나 숫자 |
\W |
알파벳이나 숫자를 제외한 문자 |
\d |
숫자 [0-9]와 동일 |
\D |
숫자를 제외한 모든 문자 |
\ |
정규표현식 역슬래시(\)는 확장 문자 역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미 |
(?i) |
앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음 |
#정규표현식 예제
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})
10) URL : "^(https?|ftp)(:\\/\\/[-_.!~*\\'()a-zA-Z0-9;\\/?:\\@&=+\\$,%#]+)$"
#일본 기준
1) 숫자만 : ^[0-9]+$
2) 영문자만 : ^[a-zA-Z]+$
3) 히라가나 : ^[\\u3040-\\u309F]+$ or ^[ぁ-ん]+$
4) 가타카나 : ^[\\u30A0-\\u30FF]+$ or ^[ァ-ヶ]+$
5) 반각 가타카나 : ^[\\uFF65-\\uFF9F]+$
6) 전각문자만 : ^[\\u3040-\\u30FF]+$
7) 한자 : ^[亜-熙]+$
#정규표현식 사용 예제
검사 방법은 3가지 방법이 있다
package Study;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternStudy {
public static void main(String[] args) {
String reg = "^[0-9]*$";//정규표현식
String strValue = "ABC";//검사할 문자열
// 결과를 true, false로 반환함
System.out.println(Pattern.matches(reg, strValue));//Pattern클래스의 matches 메서드, 대상 문자열이 패턴과 일치하는지 검사
System.out.println(reg.matches(strValue));//String클래스의 matches 메서드, 대상 문자열이 패턴과 일치하는지 검사
// 결과를 true, false로 반환함
Pattern pattern = Pattern.compile("^[0-9]*$");//주어진 정규표현식으로 패턴을 작성함
Matcher matcher = pattern.matcher(strValue);//대상 문자열이 패턴과 일치하는지 검사
System.out.println(matcher.find());
//일본어
String reg2 = "^[\\u3040-\\u309F]+$";
String str = "あい";
System.out.println(str.matches(reg2));
}
}
#정규표현식을 조합해서 쓰는 방법도 존재한다
package Study;
public class PatternStudy2 {
static final String ENGLISH_CODES = "a-zA-Z"; //영문자
static final String KOREA_CODES = "가-힣"; //한글
static final String NUMBER_CODES = "0-9"; //숫자
static final String HIRAGANA_CODES = "\\u3040-\\u309F"; //히라가나
static final String KATAKANA_CODES = "\\u30A0-\\u30FF"; //가타카나
//지정한 문자만 허용하는 정규표현을 반환함
public static String toMatchRegex(String codes) {
return "^[" + codes + "]+$";
}
//지정 문자 이외만 허용하는 정규표현을 반환함
public static String toNotMatchRegex(String codes) {
return ".*[^" + codes + "].*";
}
public static void main(String[] args) {
String str1 = "안녕하세요123";
String str2 = "あいうえABC123";
//지정한 문자만 허용하는 정규표현을 반환함
System.out.println(str1.matches(toMatchRegex(KOREA_CODES + NUMBER_CODES)));
System.out.println(str2.matches(toMatchRegex(HIRAGANA_CODES + ENGLISH_CODES + NUMBER_CODES)));
//지정 문자 이외만 허용하는 정규표현을 반환함
System.out.println(str1.matches(toNotMatchRegex(KOREA_CODES + NUMBER_CODES)));
System.out.println(str2.matches(toNotMatchRegex(HIRAGANA_CODES + ENGLISH_CODES + NUMBER_CODES)));
}
}