정규식을 사용한 java의 정규식

정규식은 일련의 문자에서 패턴을 설명하는 문자열입니다. You can use the API  정규식  for:
  • 문자 시퀀스의 유효성을 검사합니다(예: 이메일 또는 비밀번호의 유효성 확인).
  •  에서 검색 문자열;
  • 문자열의 패턴 또는 문자 집합 바꾸기.
API java.util.regex 에는 단일 인터페이스와 세 개의 클래스가 있습니다.
  • Pattern class: 정규식의 컴파일된 표현입니다. 패턴을 만들려면 해당 메서드 중 하나를 호출해야 합니다공개 정적 컴파일,  Pattern 객체를 반환합니다. 이 메서드는 정규식을 argument.
  • Matcher class: 문자열을 구문 분석하는 패턴 검색 엔진입니다. Pattern 개체에서 Matcher 메서드를 호출하여 Matcher 개체를 가져옵니다. 이 두 클래스는 함께 작동합니다.
  • PatternSyntaxException: 정규식이 유효하지 않을 때 예외를 발생시킵니다.

Matcher class

Matcher:

< td class="tg-031e">패턴을 확인하는 다음 표현식을 찾습니다
No. 방법 설명
1 boolean matches() 문자열이 패턴을 검사하면 true를 반환합니다
2 boolean find()
3 boolean find(int start) 시작 인덱스에서 패턴을 확인하는 다음 표현식 찾기

Pattern class

정규식의 컴파일된 버전입니다. 패턴 또는 정규식에 사용됩니다.

< td class="tg-031e">4
No. 방법 설명
1 static 패턴 compile(String regex) 정규식을 컴파일하고 Pattern
2 Matcher matcher( CharSequence 입력) 입력 시퀀스를 구문 분석하는 매처를 생성합니다
3 static boolean matches(String regex, CharSequence input) 입력 시퀀스를 컴파일하고 구문 분석합니다.
String[] split(CharSequence c) 문자로 시작하는 하위 문자열의 배열을 반환합니다. c
5 String pattern() 정규식 문자열을 반환합니다.

Example

import java.util.regex.*; 

public class regexTest {

public static void main(String args[]) {
패턴 p;
Matcher m;
//패턴이 있는 정규식 컴파일: "a"
p = Pattern.compile("a");
//문자열 "ab"의 정규식에 엔진을 만들고 연결합니다
m = p.matcher("ab");
//패턴이 발견되면
if(m.find()) {
System.out.println("패턴 발견됨");
}
}
}
패턴 발견됨

정규식 구문

1- 메타 문자

메타 문자는 의미가 있거나 다른 방식으로 문자입니다. 패턴이 구성되는 방식입니다. 예를 들어, 메타 문자 앞에 이면 파서에서 해석되지 않습니다. Java 정규식에서 지원하는 메타 문자는 다음 표에 나와 있습니다.

문자 설명
[ ]
{ } Quantizer
\ character는 메타문자로 간주되지 않습니다
^ 줄의 시작
$ Endline
| Operator OU
? 0 또는 앞의 식
* 0 또는 앞의 식
+ 앞의 표현식의 1배 이상
. 모든 문자를 대체합니다

예:

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

public class metaCharactersExample: {

public static void main(String[] args) {
System.out.println(
Pattern.matches(".c", "abc"));//false (. a만 대체)
System.out.println(
Pattern.matches(".. c", "abc"));//true(세 번째 문자는 c)
System.out.println(
Pattern.matches("... c", "abbc"));//true(4번째 문자는 c)

System.out.println(Pattern.matches("\\d", "2"));//true(한 자리만)
System.out.println(Pattern.matches("\\d", "332"));//false(여러 자리)
System.out.println(Pattern.matches(
"\\d","123abc"));//false(숫자 및 문자)

System.out.println(Pattern.matches(
"\\D*", "geek"));//true (암호화되지 않고 한 번 이상 나타남)
}
}
matches()Matcher 및 Pattern 클래스에 속하며 true 찾고 있는 패턴이 문자열에 있는 경우.

2- 문자 클래스

문자 클래스는 문자 집합입니다. 메타 문자 [...] 은 정규식 내의 문자 클래스를 의미합니다. 하이픈 '-'입니다. 예[0-9]은 0에서 9 사이의 숫자를 나타냅니다.

[abc] a, b 또는 c
[^abc] 부정: a,b 및 c를 제외한 모든 알파벳을 대체합니다
[a-zA-Z] 범위: a에서 z까지, A에서 Z까지 모든 문자를 바꿉니다
[a-d[m-p]] Union: a에서 d로 또는 m에서 p로 문자를 바꿉니다: [a-dm-p]
[a-z& & [ABC]] Intersection: a, b, c의 전체 교집합을 a에서 z까지의 문자로 바꿉니다
[a-z& & [^cd]] 빼기: c와 d를 제외한 a부터 z까지의 모든 문자를 바꿉니다: [abe-z]
[a-z& & [^m-p]] 빼기: m에서 p를 제외한 a에서 z까지: [a-lq-z]

Example

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

public class metaFeaturesExample: {

public static void main(String[] args) {
패턴 p;
Matcher m;
//345를 제외한 0에서 9까지의 모든 숫자
p = Pattern.compile("[0-9& & [^345]]");
m = p.matcher("7");
부울 b = m.matches();
System.out.println(b);
}
}
true

미리 정의된 문자 클래스

Java:

class 설명
. 모든 문자
\d 하나의 숫자: [0-9]
\D 숫자 [^0-9]를 제외한 모든 문자
\s 공백 문자: 줄 바꿈, 공백: [ \t\n\x0B\f\r]
\S 흰색이 아닌 문자: [^\s]
\w 단어 문자: [a-zA-Z_0-9]
\W 단어가 아닌 문자: [^\w]

Example

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

public class CharacterClassesExample{
public static void main(String args[]) {
//d: 한 자리
//+: 1자리 이상
String regex = "\\d+";
패턴 p = Pattern.compile(regex);

문자열 구문 = "the year 2015 21";

매처 m = p.matcher(문장);

if (m.find()) {
//첫 번째 그룹 표시
System.out.println("group 0:" + m.group(0));
}
}
}
group 0:2015
이 예에서 정규식 "\\d+"에는 두 개의 슬래시가 포함되어 있는데, Java에서는 항상 '\ 이전. \d은 0에서 9 사이의 범위를 의미합니다. '+ 인 경우 발견된 첫 번째 숫자만 고려됩니다: 2.

3-  수량자

Quantizers를 사용하면 문자가 반복되는 횟수를 설정할 수 있습니다.

양자화기 설명
X? X는 한 번 이상 발생하지 않습니다
X+ 1회 이상
X* 0회 또는 여러 번
X{n} n 회
X{n, } n 또는 여러 번
X{y,z} 최소 y회, z회 미만

Examples

모티프 문자열 결과
[abc]? a a
[abc]? aa none
[abc]? ab none
a? abdaaaba {a}, { },{ },{a},{a},{a},{ },{a}
a* abdaaaba {a},{ },{ },{aa},{ },{a}
a+ abdaaaba {a}, {aaa},{a}
a[3] aaaa aaa
a{3, 6} aaaaaaaa aaaaaa
[0-9]{4} 2038년 버그는 2000년 버그와 비슷합니다 {2038}, {2000}

4- 캡처 그룹

캡처 그룹은 여러 문자를 처리할 수 있는 기능을 제공합니다. 단일 단위 또는 하위 패턴으로. 예를 들어, (abc)"a", "b" 및 "c".

Catch 그룹은 왼쪽에서 오른쪽으로 열리는 괄호의 수로 계산됩니다. 표현식에서 (A(B(C))), 4개의 그룹이 있습니다. 그룹 0에는 항상 전체 표현식이 포함됩니다.
  1. 그룹 0: (A(B(C)))
  2. 그룹 1:  (A)
  3. 그룹 2:  (B(C))
  4. 그룹 3:  (C)
Java에서 표현식에 몇 개의 그룹이 있는지 확인하려면 groupCount()을 반환합니다. groupCount()int - 총 그룹 수를 나타냅니다. 다음 예제에서는 goupCount()은 숫자 4.
그룹에 의해 캡처된 부분 문자열은 group(int).

예제 1:

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

public class Goup {

public static void main(String[] args) {

패턴 p = Pattern.compile("(A(B(C)))");
매처 m = p.matcher("ABC");
if( m.matches())
for(int i= 0; i<= m.groupCount(); ++i)
System.out.println("그룹 "+i+" :"+m.group(i));

}
}
group 0:ABC
group 1:ABC
group 2:BC
group 3:C
예제 2

이 프로그램은 전화 번호의 유효성을 읽고 확인하는 정규식을 만듭니다.

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

public class regex_telephone {

public static void main(String[] args) {

문자열 정규식 = "\\b(\\d{3})(\\d{4})(\\d{3})(\\d{3})\\b";
패턴 p = Pattern.compile(regex);
문자열 tel = "2541724156348";

매처 m = p.matcher(tel);

if (m.find()) {
System.out.println("전화: ("
+ m.group(1) + ") " + m.group(2) + "-"
+ m.group(3) + "-" + m.group(4));
}
}
}
전화: (254) 1724-156-348

5- 검색 경계

찾고 있는 패턴의 위치와 시작 위치를 지정하여 패턴을 더 정확하게 만들 수 있습니다.

limiter 설명
^ 줄의 시작
$ Endline
\b 단어 끝.
\B 비단어 End.
\A 입력 시퀀스 시작
\ G 이전 발생 끝
\Z 마지막 문자를 제외한 시퀀스 끝
\z 시퀀스 끝

Examples

모티프 문자열 결과
^java$ java java
\s*java$ java java
^hello\w* helloblahblah helloblahblah
\bjava\B javascript는 프로그래밍 언어입니다 java
\Gtest test test test
\btest\b 이것은 테스트입니다 test

패턴을 찾아 바꾸기

Regex API를 사용하면 한 텍스트를 찾아 다른 텍스트로 바꿀 수 있습니다. Java에서는 Matcher 클래스의 두 가지 메소드를 사용하여 이 작업을 수행할 수 있습니다.
  • replaceFirst(String): 첫 번째 항목만 대체합니다.
  • replaceAll(String): 모든 항목을 반복하고 대체합니다.
Example:

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

public class Replacement {
public static void main(String[] args) {
패턴 p = Pattern.compile("bus");
Matcher m = p.matcher("버스로 이동 중입니다.");
문자열 s = m.replaceAll("train");
System.out.println(들);
}
}
기차로 여행 중입니다
References:
Java Doc:  정규식
JavaPoint:   Java 정규식
TutorialsPoint:  java - 정규식
Expand:  Java