λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
κ°œλ°œμ–Έμ–΄/JAVA

[Java] μ •κ·œ ν‘œν˜„μ‹ μ‚¬μš©λ°©λ²• (Pattern, Matcher)

by yunamom 2022. 4. 18.
728x90
300x250

🌼 μ •κ·œν‘œν˜„μ‹ μž‘μ„± 방법 🌼

μ •κ·œ ν‘œν˜„μ‹(Regular Expression) μ΄λž€ νŠΉμ •ν•œ κ·œμΉ™μ„ 가진 λ¬Έμžμ—΄μ˜ 집합을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ“°μ΄λŠ” ν˜•μ‹μ–Έμ–΄ μž…λ‹ˆλ‹€.

μžλ°” API java.util.regex νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•΄μ„œ μž‘μ„±ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 

✨Pattern 클래슀

μ •κ·œ ν‘œν˜„μ‹μ— λŒ€μƒ λ¬Έμžμ—΄μ„ κ²€μ¦ν•˜λŠ” κΈ°λŠ₯은 java.util.regex.Pattern 클래슀의 matches() λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ 검증할 수 μžˆμŠ΅λ‹ˆλ‹€. matches() λ©”μ„œλ“œμ˜ 첫번째 λ§€κ°œκ°’μ€ μ •κ·œν‘œν˜„μ‹μ΄κ³  λ‘λ²ˆμ§Έ λ§€κ°œκ°’μ€ 검증 λŒ€μƒ λ¬Έμžμ—΄μž…λ‹ˆλ‹€. 

검증 ν›„ λŒ€μƒλ¬Έμžμ—΄μ΄ μ •κ·œν‘œν˜„μ‹κ³Ό μΌμΉ˜ν•˜λ©΄ true, 그렇지 μ•Šλ‹€λ©΄ false값을 λ¦¬ν„΄ν•©λ‹ˆλ‹€.

import java.util.regex.Pattern;

public class RegexExample {
	public static void main(String[] args)  {
    
            String pattern = "^[0-9]*$"; //숫자만
            String val = "123456789"; //λŒ€μƒλ¬Έμžμ—΄
        
            boolean regex = Pattern.matches(pattern, val);
            System.out.println(regex);
    }
}

Pattern ν΄λž˜μŠ€ μ£Όμš” λ©”μ„œλ“œ
compile(String regex) : 주어진 μ •κ·œν‘œν˜„μ‹μœΌλ‘œλΆ€ν„° νŒ¨ν„΄μ„ λ§Œλ“­λ‹ˆλ‹€.
matcher(CharSequence input) : λŒ€μƒ λ¬Έμžμ—΄μ΄ νŒ¨ν„΄κ³Ό μΌμΉ˜ν•  경우 trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
asPredicate() : λ¬Έμžμ—΄μ„ μΌμΉ˜μ‹œν‚€λŠ” 데 μ‚¬μš©ν•  μˆ˜μžˆλŠ” μˆ μ–΄λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
pattern() : 컴파일된 μ •κ·œν‘œν˜„μ‹μ„ String ν˜•νƒœλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
split(CharSequence input) : λ¬Έμžμ—΄μ„ 주어진 μΈμžκ°’ CharSequence νŒ¨ν„΄μ— 따라 λΆ„λ¦¬ν•©λ‹ˆλ‹€.

Parttern ν”Œλž˜κ·Έ κ°’ μ‚¬μš©(μƒμˆ˜)
Pattern.CANON_EQ : Noneν‘œμ€€ν™”λœ 맀칭 λͺ¨λ“œλ₯Ό ν™œμ„±ν™”ν•©λ‹ˆλ‹€.
Pattern.CASE_INSENSITIVE : λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.  
Pattern.COMMENTS : 곡백과 #으둜 μ‹œμž‘ν•˜λŠ” 주석이 λ¬΄μ‹œλ©λ‹ˆλ‹€. (라인의 λκΉŒμ§€).
Pattern.MULTILINE : μˆ˜μ‹ ‘^’ λŠ” 라인의 μ‹œμž‘κ³Ό, ‘$’ λŠ” 라인의 끝과 match λ©λ‹ˆλ‹€.
Pattern.DOTALL : μˆ˜μ‹ ‘.’κ³Ό λͺ¨λ“  λ¬Έμžμ™€ match 되고 ‘\n’ 도 match 에 ν¬ν•¨λ©λ‹ˆλ‹€.
Pattern.UNICODE_CASE : μœ λ‹ˆμ½”λ“œλ₯Ό κΈ°μ€€μœΌλ‘œ λŒ€μ†Œλ¬Έμž ꡬ뢄 없이 match μ‹œν‚΅λ‹ˆλ‹€.
Pattert.UNIX_LINES : μˆ˜μ‹ ‘.’ κ³Ό ‘^’ 및 ‘$’의 matchμ‹œμ— ν•œ 라인의 끝을 μ˜λ―Έν•˜λŠ” ‘\n’만 μΈμ‹λ©λ‹ˆλ‹€.


✨Matcher 클래슀

Matcher ν΄λž˜μŠ€λŠ” λŒ€μƒ λ¬Έμžμ—΄μ˜ νŒ¨ν„΄μ„ ν•΄μ„ν•˜κ³  주어진 νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λŠ”μ§€ νŒλ³„ν•  λ•Œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€. 

Matcher 클래슀의 μž…λ ₯κ°’μœΌλ‘œλŠ” CharSequenceλΌλŠ” μƒˆλ‘œμš΄ μΈν„°νŽ˜μ΄μŠ€κ°€ μ‚¬μš©λ˜λŠ”λ° 이λ₯Ό 톡해 λ‹€μ–‘ν•œ ν˜•νƒœμ˜ μž…λ ₯ λ°μ΄ν„°λ‘œλΆ€ν„° 문자 λ‹¨μœ„μ˜ 맀칭 κΈ°λŠ₯을 지원 받을 수 μžˆμŠ΅λ‹ˆλ‹€. 

Matcherκ°μ²΄λŠ” Pattern객체의 matcher() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ λ°›μ•„μ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExample {
	public static void main(String[] args)  {
            Pattern pattern = Pattern.compile("^[a-zA-Z]*$"); //영문자만
            String val = "abcdef"; //λŒ€μƒλ¬Έμžμ—΄
	
            Matcher matcher = pattern.matcher(val);
            System.out.println(matcher.find());
	}
}

Matcher 클래슀 μ£Όμš” λ©”μ„œλ“œ
matches() : λŒ€μƒ λ¬Έμžμ—΄κ³Ό νŒ¨ν„΄μ΄ μΌμΉ˜ν•  경우 true λ°˜ν™˜ν•©λ‹ˆλ‹€.
find() : λŒ€μƒ λ¬Έμžμ—΄κ³Ό νŒ¨ν„΄μ΄ μΌμΉ˜ν•˜λŠ” 경우 trueλ₯Ό λ°˜ν™˜ν•˜κ³ , κ·Έ μœ„μΉ˜λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
find(int start) : startμœ„μΉ˜ 이후뢀터 맀칭검색을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
start() : λ§€μΉ­λ˜λŠ” λ¬Έμžμ—΄ μ‹œμž‘μœ„μΉ˜ λ°˜ν™˜ν•©λ‹ˆλ‹€.
start(int group) : μ§€μ •λœ 그룹이 λ§€μΉ­λ˜λŠ” μ‹œμž‘μœ„μΉ˜ λ°˜ν™˜ν•©λ‹ˆλ‹€.
end() : λ§€μΉ­λ˜λŠ”  λ¬Έμžμ—΄ 끝 λ‹€μŒ λ¬Έμžμœ„μΉ˜ λ°˜ν™˜ν•©λ‹ˆλ‹€.
end(int group) : μ§€μ •λ˜ 그룹이 λ§€μΉ­λ˜λŠ” 끝 λ‹€μŒ λ¬Έμžμœ„μΉ˜ λ°˜ν™˜ν•©λ‹ˆλ‹€.
group() : 맀칭된 뢀뢄을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
group(int group) : 맀칭된 뢀뢄쀑 group번 κ·Έλ£Ήν•‘ 맀칭뢀뢄 λ°˜ν™˜ν•©λ‹ˆλ‹€. 
groupCount() : νŒ¨ν„΄λ‚΄ κ·Έλ£Ήν•‘ν•œ(κ΄„ν˜Έμ§€μ •) 전체 갯수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.


βœ¨μœ νš¨μ„± 검사

μ •κ·œ ν‘œν˜„μ‹μ€ μœ νš¨μ„± 검사 μ½”λ“œ μž‘μ„± μ‹œ κ°€μž₯ 효율적인 λ°©λ²•μž…λ‹ˆλ‹€.

import java.util.regex.Pattern;

public class RegexExample {
	public static void main(String[] args)  {
          String name = "홍길동";
          String tel = "010-1234-5678";
          String email = "test@naver.com";
         
          //μœ νš¨μ„± 검사
          boolean name_check = Pattern.matches("^[κ°€-힣]*$", name);
          boolean tel_check = Pattern.matches("^01(?:0|1|[6-9])-(?:\\d{3}|\\d{4})-\\d{4}$", tel);
          boolean email_check = Pattern.matches("\\w+@\\w+\\.\\w+(\\.\\w+)?", email);

          //좜λ ₯
          System.out.println("이름 : " + name_check);
          System.out.println("μ „ν™”λ²ˆν˜Έ : " + tel_check);
          System.out.println("이메일 : " + email_check);
    }
}

 

좜처 : λ§ν¬

728x90
300x250

μ½”λ“œ