Java中正则表达式的应用

一、前言
在Java中如何判断两个字符串变量的内容是否相同(匹配),在前面第四章有关String类型的学习中已经有相关内容的介绍,常用的方法是String类中的equals()方法。

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String s1="Welcome to Java";
		String s2="Welcome to Java";
		String s3="Welcome to C++";
		System.out.println(s1.equals(s2));
		System.out.println(s1.equals(s3));
	}
	
}

在这里插入图片描述
另外String类中的matches()方法也有类似的功能,String.matches()这个方法主要是返回是否匹配指定的字符串,如果匹配则返回true,否则返回false。如下面这个例子:

System.out.println("Java".matches("ava"));//false
System.out.println("Java".matches("Java"));//true

不同的是,matches方法的功能更强大。它不仅可以匹配固定的字符串,还能匹配一组遵循从某种模式的字符串,如下面这个例子:

System.out.println("Java is fun".matches("Java.*"));//true
System.out.println("Java is cool".matches("Java.*"));//true
System.out.println("Java is powerful".matches("Java.*"));//true

以上代码中“Java.*”是一个正则表达式,至于输出结果为什么都是true,下面我们就来正式介绍Java中的正则表达式。

二、概念
正则表达式(regular expression)(缩写regex)是一个字符串,用于描述匹配一个字符串集的模式。

三、规则
正则表达式由字面值字符和特殊符号组成。

1、普通字符
字母、数字、汉字、下划线等都属于“普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。
eg:表达式"a"在匹配字符串"abcdefg"时,匹配结果为true,匹配到的内容是"c",匹配到的位置开始于0,结束于1。(注意字符串的下标是从0开始)。
eg:表达式"abcd"在匹配字符串"abcdefg"时,匹配结果为true,匹配到的内容为"abcd",匹配到的位置开始于0,结束于5。

2、简单的转义字符
\n,换行符
\r,回车符
\t,制表符
\f,空白符
\\,表示"\"

3、常用字符
(1)x匹配指定字符x。

System.out.println("Java".matches("Java"));//true

(2).匹配除了换行符以外的任意一个字符。

System.out.println("Java".matches("J..a"));//true

(3)(ab|cd)匹配ab或者cd。

System.out.println("Java".matches("Ja(va|av)"));//true

(4)[abc]匹配a、b或者c。
注意只有方括号里面的字符才可以参与匹配,且只能匹配单个字符

System.out.println("Java".matches("Jav[abcde]"));//true

(5)[^abc]匹配除了a、b或者c以外的任意字符。
注意^符号:表示否,如果在方括号内表示不能匹配的字符

System.out.println("Java".matches("Jav[^bcde]"));//true

(6)[a-z]匹配a到z的任意一个字符。

System.out.println("Java".matches("[A-N]av[a-d]"));//true

(7)[^a-z]匹配除了a到z之外的任意一个字符。

System.out.println("Java".matches("[^A-G]av[^b-d]"));//true

(8)[a-e[m-p]]匹配a到e或m到p的任意一个字符。

System.out.println("Java".matches("[A-N[R-W]]av[a-d]"));//true

(9)[a-e&&[m-p]]匹配a到e与m到p的交集的任意一个字符。

System.out.println("Java".matches("[A-P&&[I-W]]av[a-d]"));//true

4、多种字符匹配

表达式可匹配
\d[0-9],0到9中的任意一个数字
\D[^0-9],除0到9之外的任意一个字符
\w[0-9a-zA-Z_],任意数字或字母或下划线
\W[^0-9a-zA-Z_],除数字、字母和下划线之外的任意字符
\s[\t\n\r\f] ,空格、制表符、换行符等其中任意一个,注意不可以匹配自己输入的多个空格
\S[^\t\n\r\f] ,除空格、制表符、换行符等之外的任意一个字符

eg:

System.out.println("Java2".matches("Java[\\d]"));//true
System.out.println("$Java".matches("[\\D][\\D]ava"));//true
System.out.println("Java2_".matches("[\\w][\\w]va[\\w][\\w]"));//true
System.out.println("$Java".matches("[\\W][\\w]ava"));//true
System.out.println("Java 2".matches("Java\\s2"));//true
System.out.println("Java".matches("[\\S]ava"));//true
System.out.println("ab#%13\ta".matches("\\w.\\W\\D\\d\\d\\s\\S"));//true

5、表示匹配次数的符号(量词符):

符号次数
*0次或者多次
0次或者1次
+1次或者多次
{n}n次
{n,}至少n次
{n,m}n到m(不包含)次

eg:

System.out.println("aaa".matches("a*"));//true
System.out.println("JavaJava".matches("(Java)*"));//true
System.out.println("Java".matches("J?Java*"));//true
System.out.println("ava".matches("J?ava*"));//true

System.out.println("Java is fun".matches("(Java)+.*"));//true
System.out.println("a".matches("a+b*"));//true
System.out.println("Java".matches("Ja{1}.*"));//true
System.out.println("Java".matches(".{2}"));//false
System.out.println("aaaa".matches("a{1,}"));//true
System.out.println("aaaa".matches("a{5,}"));//false
System.out.println("aaaa".matches("a{1,9}"));//true
System.out.println("aaaa".matches("a{5,}"));//false

警告:不要在重复负量词符中使用空白。例如,A{3,6}不能写成逗号后面有一个人空白符的A{3, 6}。

注意:可以使用括号来进行模式分组。例如,(ab){3}匹配ababab,但是ab{3}匹配的是abbb。

四、示例
1、例1:
社会安全号的模式是xxx-xx-xxx,其中x是一位数字。社会安全号的正则表达式可以描述为
[\\d]{3}-[\\d]{2}-[\\d]{4}

System.out.println("345-34-8689".matches("[\\d]{3}-[\\d]{2}-[\\d]{4}"));//true
System.out.println("345-34-889".matches("[\\d]{3}-[\\d]{2}-[\\d]{4}"));//false

2、例2:
奇数以数字3、5、7、9结尾,奇数的正则表达式模式可以描述为
[\d]*[3579]

System.out.println("345".matches("[\\d]*[3579]"));//true
System.out.println("3456".matches("[\\d]*[3579]"));//false

3、例3:
电话号码的模式是(xxx)xxx-xxxx,这里x是一位数字,并且第一位数字不能为0,电话号码的正则表达式可以描述为
\\([1-9][\\d]{2}\\)[\\d]{3}-[\\d]{4}

System.out.println("(459) 989-5456".matches("\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}"));//true
System.out.println("989-5456".matches("\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}"));//false

4、例4:
假定姓由最多25个字母组成,并且第一个字母为大写形式,则姓的正则表达式模式可以描述为
[A-Z][a-zA-Z]{1,24}

System.out.println("Smith".matches("[A-Z][a-zA-Z]{1,24}"));//true
System.out.println("Smith497".matches("[A-Z][a-zA-Z]{1,24}"));//false

5、例5:
Java标识符必须以字母、下划线(_),或者美元符号(KaTeX parse error: Expected group after '_' at position 68: …表达式可以描述为 [a-zA-_̲][\w$]*

6、任何以字母A开头的字符串的正则表达式可以描述为
“A.*”

System.out.println("Adnf".matches("A.*"));//true
System.out.println("BAdnf".matches("A.*"));//false

五、功能
使用正则表达式可以通过指定某个模式来匹配、替换分割一个字符串,这是一种非常有用且功能强大的特性。String类中提供了如下几个特殊方法:
在这里插入图片描述
1、匹配
eg:以学号为例,有13位学号,要求输入的学号必须以2019开头,判断输入的学号是否符合规则

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		System.out.print("Enter teh times: ");
		int n=input.nextInt();
		do {
			System.out.print("输入学号: ");
			String number=input.next();
			String regex="2019\\d{9}";//制定学号规则
			boolean flag=number.matches(regex);//判断是否匹配
			System.out.println(flag);
			n--;
		}while(n>0);
	}

}

在这里插入图片描述

2、分割功能
eg:

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		String s="Java,c?c#,c++";
		String[] array=s.split("[.,:;?]");
		for(int i=0;i<array.length;i++) {
			System.out.println(array[i]);
		}
	}

}

在这里插入图片描述
这里,正则表达式[.,:;?]制定匹配.,,,:,;或者?的模式,这里的每个字符都是拆分字符串的分隔符。

eg:
split(regex)方法以regex作为分隔符,把该字符串分割成多个子串。

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		String s="Java1HTML2Perl";
		String regex="\\d";
		String[] array=s.split(regex);
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+" ");
		}
	}

}

在这里插入图片描述
将字符串"Java1HTML2Perl"分割为Java、HTML、Perl并且保存在array[0]、array[1]、array[2]中。

eg:
在split(regex,limit)方法中,limit参数确定模式匹配多少次。如果limit<=0,split(regex,limit)等同于split(regex)。如果limit>0,模式最多匹配limit-1次。

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		String s="Java1HTML2Perl";
		String[] array=s.split("\\d",0);
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+" ");
		}
	}

}

在这里插入图片描述

eg:

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		String s="Java1HTML2Perl";
		String[] array=s.split("\\d",1);
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+" ");
		}
	}

}

在这里插入图片描述
eg:

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		String s="Java1HTML2Perl";
		String[] array=s.split("\\d",2);
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+" ");
		}
	}

}

在这里插入图片描述
eg:

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		String s="Java1HTML2Perl";
		String[] array=s.split("\\d",3);
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+" ");
		}
	}

}

在这里插入图片描述
eg:

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		String s="Java1HTML2Perl";
		String[] array=s.split("\\d",4);
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+" ");
		}
	}

}

在这里插入图片描述
eg:

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		String s="Java1HTML2Perl";
		String[] array=s.split("\\d",5);
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+" ");
		}
	}

}

在这里插入图片描述

3、替换功能
eg:

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		String s="a+b%#c#%s+";
		String regex="[%#+]";
		String replacement="NNN";
		String flag=s.replaceAll(regex, replacement);
		System.out.println(flag);
	}

}

在这里插入图片描述

这里正则表达式[%#+]制定匹配%、#或者+的模式,且使用了replaceAll()方法,字符串中所有符合的子串都要替换。

eg:

import java.util.Scanner;
public class Hello {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		String s="a+b%#c#%s+";
		String regex="[%#+]";
		String replacement="NNN";
		String flag=s.replaceFirst(regex, replacement);
		System.out.println(flag);
	}

}

在这里插入图片描述
这里正则表达式[%#+]制定匹配%、#或者+的模式,因为使用了replaceFirst()方法,只替换字符串中第一个符合要求的子串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值