정규표현식은 개발을 하는 사람이라면 결국 보게 되는 표현이다.
가장 쉽게 접하는 분야는 회원가입시 아이디, 이메일, 비밀번호 양식을 지정할 때 접하게 된다.
한글, 영어, 특수문자, 이메일 등등 형식을 알고리즘을 통해서 만들게 된 표현식이다.
지금은 너무나 잘 정리된 표현식이라서 잘 활용만 하면 된다!
하지만 가끔 이 정규표현식을 배우기 전 char 형태로 for문을 돌려 원하는 값들을 축출하는 경우가 있다. 정규표현식이라기보단 ASCII코드로 한글자씩 비교분석한 것이다.
올드한 방법이다. 그에 비해 정규표현식은 어떻까? 두가지 방식을 비교해보자!
String str = "안녕하세요s1Adj3fl1dldks4@!";
String hangule = "";
String engstr = "";
String num = "";
String specialstr = "";
char[] cllit = str.toCharArray();
for(int i=0; i<cllit.length; i++){
char cl = cllit[i];
if('가'<=cl && '힣'>=cl) {
hangule += Character.toString(cl);
} else if('a' <= cl && 'z'>= cl){
engstr += Character.toString(cl);
} else if(Character.isDigit(cl)){
num += Character.toString(cl);
} else {
specialstr += Character.toString(cl);
}
}
System.out.println(hangule);
System.out.println(engstr);
System.out.println(num);
System.out.println(specialstr);
어떤가. ASCII코드로 분리하는 것도 있지만,
애초에 wrapper 클래스내 메서드에서 알파벳, 숫자들만 골라서 쓸 수 있는 메서드도 존재한다.
정규표현식 | 설명 |
---|---|
^ | 문자열 시작 |
$ | 문자열 종료 |
. | 임의의 한 문자(단 \은 넣을 수 없음) |
* | 앞 문자가 없을 수도 무한정 많을 수도 있음 |
+ | 앞 문자가 하나 이상 |
? | 앞 문자가 없거나 하나 있음 |
[ ] | 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타냅니다. [] 내에서 ^ 가 선행하여 존재하면 not을 나타낸다. |
{ } | 횟수 또는 범위를 나타냅니다. |
( ) | 소괄호 안의 문자를 하나의 문자로 인식 |
패턴 안에서 or 연산을 수행할 때 사용 | |
\ | 정규 표현식 역슬래시()는 확장문자 (역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미) |
\b | 단어의 경계 |
// 숫자만
String regex = ^[0-9]*$;
// 영어만
String regex = ^[a-zA-Z]*$;
// 한글만
String regex = "^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$";
String regex = "^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$";
String code = " 안녕 하세요 ㅎㅎ ";
// String reusltCode = code.trim(); // 앞,뒤 공백 제거
// 공백 처리 \p{Z} 또는 \p{Separator}: 모든 종류의 공백 또는 보이지 않는 구분 기호.
String reusltCode = code.replaceAll("\\p{Z}", "");
// 각 글자가 한글 정규표현식에 부합하는지 확인
if(reusltCode.matches(regex)){
// if(Pattern.matches(regex, code)){
System.out.println("true");
} else {
System.out.println("false");
}
// 개인적으로 많이 사용하는 방식
// matches(정규표현식) 메서드만 사용하면 되니까!
reusltCode.matches("^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$");
*
은 맨 앞에 올 수 없기 때문에 앞에 .
을 써준다.+
는 한글이 하나 이상 반복됨을 의미.*
는 한 글자 또는 문자열Pattern이라는 클래스를 알 수 있다. 이 클래스는 꼭 알아두자. 자바에서 정규표현식을 사용할 때 많이 사용하는 클래스로, 패턴 매치로 matach(), complie() 메서드를 가지고 있다.
String regex = "^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$";
boolean checkHangle = Pattern.matches(regex, s);
Pattern pattern = Pattern.compile("\\bcat\\b");
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex {
static public void main(String[] args) {
String REGEX = "([0-9]{2,3}-[0-9]{3,4}-[0-9]{4})";
String INPUT1 = "010-1234-5678";
String INPUT2 = "010-1234-5678로 연락주세요 ~";
System.out.println(pattern.matches(REGEX, INPUT1)); // true
System.out.println(pattern.matches(REGEX, INPUT2)); // false
}
}
Matcher는 match operation을 수행하는 engine이다. Matcher는 다음과 같이 Pattern 객체로부터 생성된다. 인자로 패턴을 찾을 문자열을 전달한다.
// 아직까지 활용못함...
Pattern pattern = Pattern.compile("\\bcat\\b");
Matcher matcher = pattern.matcher("cat cat cat cattie cat");
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex {
static public void main(String[] args) {
String REGEX = "([0-9]{2,3}-([0-9]{3,4}-[0-9]{4}))";
String INPUT = "My number is 010-1234-5678. touch me.";
Pattern pattern = Pattern.compile(REGEX);
Matcher matcher = pattern.matcher(INPUT);
if(matcher.find()) {
System.out.println(matcher.group()); // 010-1234-5678
}
}
}
출처: https://gngsn.tistory.com/53 [ENFJ.dev:티스토리]