Java从零开始学三十二(正则表达式)

一、为什么要有正则

正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证、拆份、替换功能。

例如:现在要求判断一个字符串是否由数字组成,则可以有以下的两种做法:

不使用正则完成

使用正则完成

二、Pattern、Matcher类

如果要想在程序中应用正则表达式则必须依靠Pattern类与Matcher类,这两个类都在java.util.regex包中定义。Pattern类的主要作用是进行正则规范的编写,而Matcher类主要是执行规范,验证一个字符串是否符合其规范。

常用正则规则


No.

规范

描述

No.

规范

描述

1

\\

表示反斜线(\)字符

2

\t

表示制表符

3

\n

表示换行

4

[abc]

字符a、b或c

5

[^abc]

除了a、b、c之外的任意字符

6

[a-zA-Z0-9]

表示由字母、数字组成

7

\d

表示数字

8

\D

表示非数字

9

\w

表示字母、数字、下划线

10

\W

表示非字母、数字、下划线

11

\s

表示所有空白字符(换行、空格等)

12

\S

表示所有非空白字符

13

^

行的开头

14

$

行的结尾

15

.

匹配除换行符之外的任意字符

 

   数量表示(X表示一组规范)

No.


规范

描述

No.

规范

描述

1

X

必须出现一次

2

X?

可以出现0次或1次

3

X*

可以出现0次、1次或多次

4

X+

可以出现1次或多次

5

X{n}

必须出现n次

6

X{n,}

必须出现n次以上

7

X{n,m}

必须出现n~m次

逻辑运算符(X、Y表示一组规范)

No.


规范

描述

No.

规范

描述

1

XY

X规范后跟着Y规范

2

X | Y

X规范或Y规范

3

(X)

做为一个捕获组规范

Pattern类的常用方法


No.

方法

类型

描述

1

public static Pattern compile(String regex)

普通

指定正则表达式规则

2

public Matcher matcher(CharSequence input)

普通

返回Matcher类实例

3

public String[] split(CharSequence input)

普通

字符串拆分

在Pattern类中如果要想取得Pattern类实例,则必须调用compile()方法。

Matcher类的常用方法


No.

方法

类型

描述

1

public boolean matches()

普通

执行验证

2

public String replaceAll(String replacement)

普通

字符串替换

如果要验证一个字符串是否符合规范,则可以使用Matcher类

三、正则验证

3.1、验证字符组成

package com.pb.demo2;

import java.util.regex.Pattern;

public class RegexDemo1 {

    public static void main(String[] args) {
        String str="1234567890"; //声明字符串由数字组成
        //使用正则验证
        if(Pattern.compile("[0-9]+").matcher(str).matches()){
            System.out.println("数字组成。");
        }else{
            System.out.println("不全是由数字组成。");
        }

    }

}

3.2、验证一字符串是否是合法日期格式

package com.pb.demo2;

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

/*
 * 验证一字符串是否是合法日期格式
 */
public class RegexDemo2 {

    public static void main(String[] args) {
        String str="1983-07-23";
        String pat="\\d{4}-\\d{1,2}-\\d{1,2}";   //定义规则
        Pattern p=Pattern.compile(pat);      //实例化pattern类对象
        Matcher m=p.matcher(str);                 //验证字符串内容是否合法
        //使用正则验证
        if(m.matches()){
            System.out.println("日期格式合法! !");
        }else{
            System.out.println("日期格式不合法! !");
        }

    }

}

3.3、按照字符串的数字将字符串拆分

package com.pb.demo2;

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

/*
 * 按照字符串的数字将字符串拆分
 */
public class RegexDemo2 {

    public static void main(String[] args) {
    String str="A1B22C333D4444E55555F6G77";
    String pat="\\d+";                         //定义拆分的规则
    Pattern p=Pattern.compile(pat); //实例化Pattern类
    String [] ss=p.split(str);                //拆分为字符串数组
                    //遍历
        for (String s : ss) {
            System.out.print(s+"\t");
        }

    }

}

结果:

A    B    C    D    E    F    G    

3.4、替换操作

package com.pb.demo2;

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

/*
 * 按照字符串的数字将字符串替换
 */
public class RegexDemo4 {

    public static void main(String[] args) {
    String str="A1B22C333D4444E55555F6G77";
    String pat="\\d+";                         //定义替换的规则
    Pattern p=Pattern.compile(pat); //实例化Pattern类
    Matcher m=p.matcher(str);            //实例化Matcher类
    String newStrirng=m.replaceAll("_");//替换的字符
    System.out.println(newStrirng);

    }

}

结果:

A_B_C_D_E_F_G_

3.5、邮箱验证

package com.pb.demo2;

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

/*
 * 邮箱是否合法
 */
public class RegexDemo5 {

    public static void main(String[] args) {
    Scanner input=new Scanner(System.in);
    //String pat="^[A-Za-z0-9_][email protected][A-Za-z0-9_]+(.[A-Za-z_]{2,3}){1,2}$";
    String regEx="^\\[email protected]\\w+(.[A-Za-z_]{2,3}){1,2}$";
    System.out.println("输入邮箱:");
    String email=input.nextLine();
    Pattern p=Pattern.compile(regEx);
    Matcher m=p.matcher(email);
    if(m.matches()){
        System.out.println("邮箱合法!!");
    }else{
        System.out.println("邮箱不合法!!");
    }

    }

}

四、String对正则表达式的支持

在String类中有以下三个方法是支持正则操作


No.

方法

类型

描述

1

public boolean matches(String regex)

普通

字符串匹配

2

public String replaceAll(String regex,String replacement)

普通

字符串替换

3

public String[] split(String regex)

普通

字符串拆分
时间: 2024-12-23 20:06:52

Java从零开始学三十二(正则表达式)的相关文章

Java从零开始学三十五(JAVA IO- 字节流)

一.字节流 FileOutputStream是OutputStream 的直接子类 FileInputStream也是InputStream的直接子类 二.文本文件的读写 2.1.字节输入流 Test.txt文件内容 abcdefg package com.pb.io; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOExcept

Java从零开始学四十二(DOM解析XML)

一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <PhoneInfo name="手机品牌"> <Brand name="华为"> <Type name="U8650"> </Type> </Brand

Java从零开始学三十六(JAVA IO- 字符流)

一.字符流 BufferedReader:BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中 BufferedWriter:把一批数据写入到缓冲区,当缓冲区区的满时,再把缓冲区的内容写到字符输出流中 二.对文本文件的读写 2.1.字符输入流 2.2.字符输出流 2.3.综合使用 package com.pb.io.buffered; import java.io.BufferedReader; import java.io.BufferedWriter;

Java从零开始学三十八(JAVA IO- 重定向IO)

一.三个静态变量 java.lang.System提供了三个静态变量 System.in(默认键盘) System.out(默认显示器) System.err 二.重写向方法 System提供了三个重定向方法 方法 说明 static void setErr(PrintStream errr) 重定向标准错误输出流 static void setIn(InputStream in ) 重定向标准输入流 static void setOut(PrintStream out) 重定向歀输出流 三.例

Java从零开始学三十(String和StringBuffer类)

一.StringBuffer连接字符操作 当一个字符串的内容需要被经常改变时就要使用StringBuffer 在StringBuffer中使用append()方法,完成字符串的连接操作 二.StringBuffer类的常用方法 No. 方法定义 类型 描述 1 public StringBuffer() 构造 StringBuffer的构造方法 2 public StringBuffer append(char c) 方法 在StringBuffer中提供了大量的追加操作(与String中使用“

Java从零开始学三十三四(JAVA IO-流简述)

一.流概念(stream) File类并不能对文件内容进行读写. 读文件就是指:把文件的内中的数据读取到内存中来 写文件就是指:把内存中的数据写入到文件中去. 通过什么读写文件呢?文件流. 1.1.流概念 一连串流动的字符 1.2.流的特性 先进先出的方式传递信息 一个字节序列 具有方向性:输入流.输出流 二.按照流向划分 输入流:读取数据--InputStream和Reader作为基类 输出流:写入数据--OutputStream和Writer作为基类 一共四个4基类. 其中InputStre

Java从零开始学四十(反射简述一)

一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反射.通过反射,Java可以于运行时加载.探知和使用编译期间完全求和的类.生成其对象实体,调用其方法或者对属性设值.所以Java算是一个半动态的语言吧. 反射的概念: 在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方

Java从零开始学三十七(JAVA IO- 二进制文件读写)

一.简述 二.使用步骤 DataInputStream: 引入相关的类 构造数据输入流的对象(如:FileInputStream,BufferedWriter包装后读取文件等) 读取二进制文件的数据 关闭数据输入流 DataOutputStream: 引入相关的类 构造数据输出流的对象(如:FileOputStream,BufferedWriter包装后写入文件等) 写入二进制文件的数据 关闭数据输入流 三.使用 package com.pb.data; import java.io.Buffe

Java从零开始学三十一(DATE和Calendar类)

一.Date类 Date类是一个相对较为简单的操作类,在使用中直接使用java.util.Date类的构造方法并进行输出就可以得到一个完整的日期 二.Calendar类 Calendar类可以将取得的时间精确到毫秒.但是,这个类本身是一个抽象类,如果要想使用一个抽象类,则必须依靠对象的多态性,通过子类进行父类的实例化操作,Calendar的子类是GregorianCalendar类. package com.pb.demo3; import java.util.Calendar; import