2020. 8. 18. 15:40ㆍSpring/Java
안녕하세요.
이전 포스팅에서 알아본 정규식을 활용하여 java에서 사용하는 방법을 알아보려합니다.
정규식이 낯설다면 이전의 정규식 포스팅을 참고해주세요!
**************** 참고 *****************
********************************************
자바에서 정규식을 사용하려면 반드시 알아야하는 클래스가 두 개 있습니다.
바로, Pattern Class와 Matcher Class 입니다.
이제부터 두 클래스 중 Pattern 객체를 알아보도록 해볼게요 〰️
🔥 Pattern Class
Pattern Class는 JAVA에서 정규식을 사용하기 위해 가장 기초적으로 알아야할 객체입니다.
java.util.regex 패키지에서 포함하고 있습니다.
이제부터 Pattern Class가 갖고 있는 8개의 method를 소개해드리겠습니다.
🧷 compile ()
✔️ static Pattern compile (String regex [, int flags])
compile method는 String 값으로 들어온 정규식을 Pattern 객체로 바꿔줍니다.
아래는 method를 더 잘 이해하기 위한 사용 예시입니다!
// 예시 1
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
}
}
}
간단하죠 〰️
그런데 여기서 flags는 뭘까요❓
정규식을 매칭하는 방식에 비트 마스크를 적용합니다.
flags 의 종류로는 CASE_INSENSITIVE, MULTILINE, DOTALL, UNICODE_CASE, CANON_EQ, UNIX_LINES, LITERAL, COMMENTS 가 있습니다.
더 자세한 내용은 이 곳에 잘 명시되어 있어 한 번 살펴보시는 것도 좋을 것 같네요.
사용한 flags를 확인하고 싶다면, java.util.regex.Pattern.flags()
를 통해 확인할 수 있습니다.
참고로, 위의 mehtod는 public int flags()
으로 정의되어 있습니다.
🧷 matcher ()
✔️Matcher matcher (CharSequence input)
compile method는 String 값으로 들어온 정규식을 Pattern 객체로 바꿔줍니다.
matcher method는 regex에 대해 input값과 매칭되는 Matcher객체를 만들어 반환합니다.
이 mehtod를 사용하려면 Matcher 객체에 대해 알아야겠죠❓
Matcher 객체는 아래에서 더 자세히 알아보도록 하겠습니다.
참고로 말씀드리자면, [예시 1]에서도 matcher메소드를 사용했습니다.
🧷 matches ()
✔️public static boolean matches (String regex, CharSequence input)
matches mathod는 첫 번째 인자로 받은 정규식을 컴파일하여 두 번째 인자로 받은 데이터에 매칭합니다.
만약, 정규식에 매칭되는 데이터면 true를 매칭되지 않다면 false를 반환합니다.
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
}
}
위와 같이 전화번호를 검색하는 정규식에 맞는 데이터면 true를 출력하는 것을 확인할 수 있습니다.
🧷 pattern ()
✔️public String pattern ()
Pattern 객체가 갖고 있는 정규식 pattern을 반환하는 method입니다.
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 = "010-1234-5678";
System.out.println(pattern.pattern()); // ([0-9]{2,3}-[0-9]{3,4}-[0-9]{4})
}
}
🧷 quote ()
✔️ public static String quote (String s)
정규식을 사용해서 데이터를 매칭할 때, 만약 '[abc'를 포함하는 데이터를 검색하고 싶을 땐 어떻게 해야할까요❓
언뜻 보면 문제가 없어보이는데요.
대괄호는 정규식에서 OR Operation을 사용할 수 있는 표현법이기 때문에 문제가 생기게 되죠.
// Error : Unclosed character class
"[123".matches("[123");
이럴 때 사용하는게 quote method입니다.
Pattern.quote("[123"); // "\Q[123\E"과 동일
/*
\Q 는 정규 표현식의 시작 표시
\E 는 정규 표현식의 끝을 표시
*/
🧷 split ()
✔️String[] split (CharSequence input[, int limit])
split method는 input에 해당하는 문자열을 기준으로 데이터를 잘라줍니다.
아래의 예시를 보겠습니다.
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex {
static public void main(String[] args) {
String REGEX = ":";
String INPUT = "boo:and:foo::";
Pattern pattern = Pattern.compile(REGEX);
String[] result = pattern.split(INPUT);
System.out.println(Arrays.toString(result)); // [boo, and, foo]
}
}
":"을 기준으로 데이터를 잘라서 배열에 담은 것을 확인할 수 있습니다.
이 때, 데이터가 없다면 배열에 담지 않는 것도 확인하셨나요❓
만약, 그것까지 포함하고 싶다면 두 번째인자인 limit을 활용하면 됩니다.
limit은 split을 어느 범위까지 할 것인지를 결정해줍니다.
default는 0으로 위의 출력과 동일하죠.
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex {
static public void main(String[] args) {
String REGEX = ":";
String INPUT = "boo:and:foo::";
Pattern pattern = Pattern.compile(REGEX);
String[] result1 = pattern.split(INPUT, 0); // limit이 0일때
System.out.println(Arrays.toString(result1)); // [boo, and, foo]
String[] result2 = pattern.split(INPUT, 2); // limit이 양수일때
System.out.println(Arrays.toString(result2)); // [boo, and:foo::]
String[] result3 = pattern.split(INPUT, -1); // limit이 음수일때
System.out.println(Arrays.toString(result3)); // [boo, and, foo, , ]
}
}
양수일 때에는 limit 번째부터 split을 하지 않으며, 음수일 때에는 공백 또한 데이터에 포함합니다.
🧷 toString ()
✔️ public String toString ()
pattern 객체를 String으로 변환하여 반환해줍니다.
'Spring > Java' 카테고리의 다른 글
Masking Name with Regex, in java (0) | 2022.05.29 |
---|---|
Java Date & Time, 제대로 사용하기 (2) | 2022.05.22 |
ENUM, Clean Code with Java (0) | 2022.05.11 |
Matcher, 어렵지 않게 사용하기 (2) | 2020.08.24 |
HashMap, 어렵지 않게 사용하기 (3) | 2020.07.06 |
Backend Software Engineer
𝐒𝐮𝐧 · 𝙂𝙮𝙚𝙤𝙣𝙜𝙨𝙪𝙣 𝙋𝙖𝙧𝙠