다크호스 프로그래머 - 자바 기초 지식의 정규 표현 식
16375 단어 다크호스 프로그래머 기술 블 로그
1. 정규 표현 식 기초 (1), 정규 표현 식 은 무엇 입 니까?자바 의 유 닉 스 도구 모음 에 있 는 강력 하고 유연 한 텍스트 처리 도구 입 니 다.(2) 정규 표현 식 은 어떤 역할 을 합 니까?일부 특정한 기호 에 사용 하여 코드 조작 을 표시 하고 문자열 을 조작 합 니 다.문자열 에 대한 조작 을 간소화 할 수 있 습 니 다.(3) 주요 한 네 가지 구체 적 인 기능: 일치, 절단, 교체 와 일치 하 는 것 은 진짜 와 가짜 입 니 다.절단 은 규칙 이외 의 것 을 꺼 내 서 교체 하 는 것 이다. 교 체 된 것 을 꺼 내 서 가 져 오 는 것 은 규칙 이내 의 것 을 꺼 내 는 것 이다 (4). 흔히 볼 수 있 는 정규 표현 식 기호 이다. 설명: X 는 문자 X 또는 일치 하 는 규칙 을 나타 낸다.1. 문자 x 문자 x \ \ 역 사선 문자 \ t 탭 문자 ('\ u0009') 새 줄 (줄 바 꿈) 문자 ('\ u000A') \ r 리 턴 문자 ('\ u000D') \ f 페이지 바 꿈 문자 ('\ u000C') \ a 경보 (bell) 문자 ('\ u0007') 2, 문자 류 [bc] a, b 또는 c (단순 클래스) [^ abc] 를 제외 한 모든 문자, a, b 또는 c (부정) [a - zA - Z] a 에서 z 또는 A 에서 Z 까지두 글자 의 자 모 는 포함 (범위) [a - d [m - p] a 에서 d 또는 m 에서 p: [a - dm - p] (집합) [a - z & & [def] d, e 또는 f (집합) [a - z & & [^ bc] a 에서 z 까지 b 와 c: [ad - z] (빼 기) [a - z & [^ m - p] a 에서 z 가 아 닌 m 에서 p: [a - lq - z] (빼 기) 3, 미리 정 의 된 문자 류 입 니 다. 모든 문자 (줄 끝 문자 와 일치 하지 않 을 수도 있 습 니 다)\ d 숫자: [0 - 9] \ \ D 비 숫자: [^ 0 - 9] \ s 공백 문자: [\ t \ x0B \ \ f \ r] \ \ S 비 공백 문자: [^ \ s] \ w 단어 문자: [a - zA - Z 0 - 9] \ W 비 단어 문자: [^ \ \ w] 4, 경계 정합 기 ^ 줄 의 시작 $줄 의 끝 \ b 단어 경계 \ B 비 단어 경계 \ A 입력 의 시작 \ G 위의 일치 하 는 끝 \ Z 입력 의 끝,마지막 끝 문자 (있 으 면) \ z 입력 의 끝 5, Greedy 수량 단어 X 에 만 사용 합 니까?X, 한 번 또는 한 번 도 X * X, 0 번 또는 여러 번 X + X 가 없습니다. 한 번 또는 여러 번 X {n} X, 마침 n 번 X {n,} X, 적어도 n 번 X {n, m} X, 적어도 n 번 을 초과 하지 않 지만 m 번 6 을 초과 하지 않 습 니 다. 그룹 은 괄호 로 구 분 된 정규 표현 식 으로 그룹의 번호 에 따라 그룹 을 참조 할 수 있 습 니 다.그룹 번 호 는 0 으로 전체 표현 식 을 나타 내 고 그룹 번호 1 은 첫 번 째 괄호 로 묶 인 그룹 을 나타 내 며 이 를 유추 합 니 다.따라서 아래 표현 식: A (B (C) D 에는 세 개의 그룹 이 있 고, 그룹 0 은 ABCD 이 며, 그룹 1 은 BC 이 며, 그룹 2 는 C. 2. 정규 표현 식 기능 의 구체 적 인 응용 (1) 정규 표현 식 이 일치 하 는 응용 주의: ① \ d 는 숫자 [0 - 9] 를 표시 하지만 정규 표현 식 에 서 는 역 슬 래 쉬 "\" 는 "\ d" ② 와 같이 쌍 을 지어 나타 나 야 합 니 다. 일치: String matches 방법.규칙 으로 전체 문자열 을 일치 시 킵 니 다. 규칙 에 맞지 않 는 곳 이 있 으 면 일치 가 끝나 고 false 로 돌아 갑 니 다.예:
/*
1:
13xxx 15xxx 18xxxx
*/
public static void checkTel()
{
String tel = "16900001111";
String telReg = "1[358]\\d{9}";
System.out.println(tel.matches(telReg));
}
/*
2: "b23a23456789" "[a-zA-Z]\\d*" ,
*/
public static void demo()
{
String str = "b23a23456789";
String reg = "[a-zA-Z]\\d*";
boolean b= str.matches(reg);
System.out.println(b);
}
/*
3: QQ
:5~15 0 ,
*/
public static void checkQQ()
{
String qq = "123a454";
String regex = "[1-9]\\d{4,14}";
boolean flag = qq.matches(regex);
if(flag)
System.out.println(qq+"...is ok");
else
System.out.println(qq+"... ");
}
(2) 정규 표현 식 절단 의 응용 주의: 절단: String 클래스 의 String [] split (String regex) 방법의 주요 형식: String str = ";String reg = "; String [] arr = str. split (reg); 예:
/*
1、
*/
class SplitDemo
{
public static void main(String[] args)
{
String regex1="\\.";// .
String regex2=" +";// ,
String regex3="(.)\\1+";//
String[] arr="13.56.24.56.87".split(regex1);// .
print(arr);
arr ="haha hrhr jrkkc ksdfs dfs fdsd ".split(regex2);//
print(arr);
arr="hhjdjajjjjdfhgggdfsdjj".split(regex3);//
print(arr);
}
(3) 정규 표현 식 대체 적용 주의: 교체: String replace All (regex, str); regex 에 정의 그룹 이 있 으 면 두 번 째 매개 변수 에서 $기 호 를 통 해 정규 표현 식 에 있 는 기 존 그룹 을 가 져 올 수 있 습 니 다. 예:
String str = "wer138998000000ty1234564uiod234345675f";// #。
replaceAllDemo(str,"\\d{5,}","#");
String str1 = "erkktyqqquizzzzzo";// $. // 。zzzz->z
replaceAllDemo(str1,"(.)\\1+","$1");
(4) 정규 표현 식 에서 가 져 온 응용 주의: 일치 하 는 것 은 문자열 의 규칙 에 맞 는 부분 을 꺼 내 는 것 입 니 다. 흔히 볼 수 있 는 네트워크 파충류 기술 입 니 다. 일치 하 는 형식 과 사고방식 으로: String str = "wo shi duan huang jun", String reg = ", 첫 번 째 단계: 정규 표현 식 을 대상 Pattern p = Pattern. copile (reg) 로 밀봉 합 니 다.; 두 번 째 단계: 정규 대상 을 조작 할 문자열 과 연결 시 켜 일치 하 는 대상 을 가 져 옵 니 다. Matcher m = p. Matcher (str), 세 번 째 단계: 연결 후 정규 일치 하 는 엔진 을 가 져 옵 니 다. 네 번 째 단계: 엔진 을 통 해 규칙 에 맞 는 하위 문자열 을 가 져 옵 니 다. 예 를 들 어 추출 합 니 다.
예:
*/
import java.util.regex.*;
class RegexDemo2
{
public static void main(String[] args)
{
getDemo();
}
public static void getDemo()
{
String str = "ming tian jiu yao fang jia le ,da jia。";
System.out.println(str);
String reg = "\\b[a-z]{4}\\b";
// 。
Pattern p = Pattern.compile(reg);
// 。 。
Matcher m = p.matcher(str);
//boolean b = m.find();// , 。
//System.out.println(b);
//System.out.println(m.group());// 。
while(m.find()) //
{
System.out.println(m.group());
System.out.println(m.start()+"...."+m.end());
//start() end()
}
}
}
3. 정규 표현 식 깊이 1, 정규 표현 식 과 자바 I / O 는 지금까지 정규 표현 식 으로 정적 문자열 을 처리 하 는 예 를 보 았 습 니 다. 정규 표현 식 으로 파일 을 스 캔 하고 일치 하 는 문자열 을 찾 는 방법 을 보 여 드 리 겠 습 니 다. 유 닉 스 의 grep 에서 영감 을 받 아 JGrep. 자바 라 고 썼 습 니 다. 파일 이름과 일치 하 는 문자열 이 필요 합 니 다.정규 표현 식 을 사용 합 니 다. 이 정규 표현 식 의 일부 내용 과 소속 줄 의 줄 번 호 를 인쇄 합 니 다.
//: c12:JGrep.java
// A very simple version of the "grep" program.
// {Args: JGrep.java "//b[Ssct]//w+"}
import java.io.*;
import java.util.regex.*;
import java.util.*;
import com.bruceeckel.util.*;
public class JGrep {
&nbsnbsp;p = Pattern.compile(args[1]);
// Iterate through the lines of the input file:
ListIterator it = new TextFile(args[0]).listIterator();
while(it.hasNext()) {
Matcher m = p.matcher((String)it.next());
while> // Iterate through the lines of the input file:
ListIterator it = new TextFile(args[0]).listIterator();
while(it.hasNext()) {
Matcher m = p.matcher((String)it.next());
while(m.find())
System.out.println(it.nextIndex() + ": " +
m.group() + ": " + m.start());
}
}
} ///:~
2. Scanner 의 경계 문자 와 정규 표현 식 스 캔 사용
import java.util.Scanner;
import java.util.regex.MatchResult;
/**
* @author clydelou
*
*/
public class ScannerDelimiter {
/**
* @param args
*/
static String threatData = "58.27.82.161@02/10/2005/n"
+ "204.45.234.40@02/11/2005/n" + "58.27.82.161@02/11/2005/n"
+ "58.27.82.161@02/12/2005/n" + "58.27.82.161@02/13/2005/n"
+ "[next log section with different data format]";
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner("12, 42,78,99,42");// ,Scanner ,
scanner.useDelimiter("//s*,//s*");// ( )
System.out.println(scanner.delimiter());// delimiter() Pattern
while (scanner.hasNextInt())
System.out.print(scanner.nextInt() + "/t");
System.out.println();
//
// next() , , match() .
// : , , , .
scanner = new Scanner(threatData);
String pattern = "(//d+[.]//d+[.]+//d+[.]//d+)@"
+ "(//d{2}///d{2}///d{4})";
4. 정규 표현 식 이 파악 해 야 할 기본 예 (1) 작업 중 IP 주 소 를 정규 표현 식 으로 처리 하 는 경우 가 많 습 니 다.
/*
:
ip 。
192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301
:
, 3 。
1、 0 , 3 。
2、 3 。 , ip 3 。
*/
import java.util.*;
class IPSortTest
{
public static void main(String[] args)
{
String ip="192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301";
System.out.println(ip);
String regex="(\\d+)";
ip=ip.replaceAll(regex,"00$1");// -------------
System.out.println(ip);
regex="0*(\\d{3})";
ip=ip.replaceAll(regex,"$1");//
System.out.println(ip);
regex=" ";
String[] arr=ip.split(regex);//
// TreeSet ,
TreeSet<String > ts=new TreeSet<String>();
for (String str : arr )
{
ts.add(str);//
}
regex="0*(\\d+)";// 0
for (String s : ts)
{
System.out.println(s.replaceAll(regex,"$1"));// 0
}
}
}
(2) 작업 중 메 일 주 소 를 검사 분석 합 니 다. 검 사 는 보통 정규 표현 식 의 일치 기능 으로 합 니 다. 일치 하 는 matches 방법 예 를 생각해 보 세 요.
/*
*/
package cn.dhj;
public class TestYouJian {
public static void main(String[] args){
String mail = "[email protected]";
String reg = "[0-9a-zA-Z_]+@[0-9a-zA-Z]+(\\.[a-zA-Z]+)+";
System.out.println(mail.matches(reg));
}
}