学习Java之正则表达式

Posted So istes immer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习Java之正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式

1.简介

正则表达式是一种可以用于模式匹配替换的规范,由普通的字符(例如字符a到z)以及特殊字符(元字符)组成。
Java对正则表达式的处理集中在以下两个类:
java.util.regex.Pattern 模式类:用来表示一个编译过的正则表达式。
java.util.regex.Matcher 匹配类:用模式匹配一个字符串所表达的抽象结果

2.常用符号

①句点.匹配单个字符,可匹配所有字符,包括空格、Tab字符甚至换行符

②方括号[]匹配括号里的字符集,但只能匹配一个

③圆括号()加上 | 符号可匹配多个字符

④^用来匹配字符串的开始
⑤$用来匹配字符串的结束
贪婪量词:可以匹配多次

⑤转义字符“\\”
⑥在方括号内,“^”表示不想要匹配的字符
快捷符号

3.小题目

①匹配美国的社会安全号码。这个号码的格式是999-99-9999。
正则式:[0-9]{3} \\\\-[0-9]{2} \\\\- [0-9]{4}
“-”有着特殊的意义,它表示一个范围,比如[0-9],所以要用“\\\\”转义
②美国汽车牌照的一种格式是四个数字加上二个字母,如8836KV
正则式:[0-9]{4}[A-Z]{2}
③假设要从格式为“June 26, 1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式:[a-z]+\\\\s+[0-9]{1,2},\\\\s*[0-9]{4}
④用正则表达式表示
整数:-?[1-9]\\d*|0
正整数:[1-9]\\d*,
非负整数:[1-9]\\d*|0
1-12(小时,月份):^(1[012]|[1-9])$
1-24(小时):^(2[0-4]|1\\d|[1-9])$
1-31(每月的天次):^(3[01]|[12]\\d|[1-9])$
1-53(每年的周次):^(5[0-3]|[1-4]\\d|[1-9])$
0-59(分、秒):^[1-5]?\\d$
0-100(百分数):^([1-9]?\\d|100)$
1-100:^([1-9]\\d?|100)$
32-126(可打印的ASCII字符):^(3[2-9]|[4-9]\\d|1[01]\\d|12[0-6])$
1-366(一年中的天次):^([1-9]\\d?|[12]\\d\\d|3[0-5]\\d|36[0-6])$
(在Java中,你必须对每一个向前的斜杠“\\”进行转义处理,所以上面所有"\\“符号的前面,还要再加一个”\\",此处未加)

4.正则在Java中的使用

一、通过java.util.regex包下的Pattern类Matcher类实现
首先引入包:java.util.regex
使用方法
①构造一个模式.
Pattern p=Pattern.compile("[a-z]*");
②建造一个匹配器
Matcher m = p.matcher(str);
③进行判断,得到结果
boolean b = m.matches()

二、Matcher类提供三个匹配操作方法
①m.matches()
matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true
②m.lookingAt()
lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
③m.find()
find()对字符串进行匹配,匹配到的字符串可以在任何位置

三、Pattern.split()
此方法将目标字符串按照Pattern里所包含的正则表达式为模进行分割
:Pattern p=Pattern.compile("\\\\d+");
String[] str=p.split(“我的QQ是:456456我的电话是:0532214我的邮箱是:aaa@aaa.com”)
结果:str[0]=“我的QQ是:” str[1]=“我的电话是:” str[2]=“我的邮箱是:aaa@aaa.com”

四、matcher.group()
group()方法是针对()来说的
group(0)指的是整个正则表达式,group(1)指的是第一个括号里的东西
正则表达式分组是从左至右计算,其左括号有几个就可以分为几组
:Pattern pat = Pattern.compile(“count(\\d+)(df)”);
Matcher mat = pat.matcher( “count000dfdfsdffaaaa1”);
if(mat.find()){
System.out.println(mat.group(2));
}
结果
mat.group() 输出为 count000df
mat.group(1) 输出为 000
mat.group(2) 输出为 df

五、Matcher类中的replaceAll()和replaceFirst()
Pattern pattern = Pattern.compile(“正则表达式”);
Matcher matcher = pattern.matcher(“正则表达式 Hello World,正则表达式 Hello World”);
System.out.println(matcher.replaceAll(“Java”)); //替换所有符合正则的数据
System.out.println(matcher.replaceFirst(“Java”));//替换第一个符合正则的数据

六、字符串中的replaceAll() 方法
用于将目标字符串中匹配某正则表达式的所有子字符串替换成新的字符串
语法形式如下:
字符串.replaceAll(String regex, String replacement)
:将"The quick\\t\\t brown fox jumps over the lazy dog.“句子中多余的空格去掉,规范成这样:“The quick brown fox jumps over the lazy dog.”
做法
String s = “The quick\\t\\t brown fox jumps over the lazy dog.”;
String r = s.replaceAll(”\\s+", " ");

5.练习

1.运用正则表达式判断字符串是否包含数字
HasNum.java

import java.util.Scanner;
import java.util.regex.*;

public class HasNum {
	public static void main(String[] args) {
		String reg = "\\\\d";
		Pattern pattern = Pattern.compile(reg);
		Scanner s =new Scanner(System.in);
		System.out.print("请输入一行字符串:");
		String str = s.nextLine();
		Matcher matcher=pattern.matcher(str); 
        if(matcher.find()) 
        	System.out.println("含有数字"); 
        else  
        	System.out.println("不含有数字"); 
        s.close();
	}	
}

测试结果

请输入一行字符串:55555
含有数字

2.用户从键盘输入出生日期格式要为 yyyy-mm-dd(mm可以是一位,dd也可以是一位,年份为90后,比如1997-1-1合法),请运用正则式判断用户输入的日期是否合法

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

public class LegalDate {
	public static void main(String[] args) {
		String reg = "(199[26][\\\\-](0?2[\\\\-](0?[1-9]|[12][0-9])|(0?[13578]|1[02])[\\\\-](0?[1-9]|[12][0-9]|3[01])|(0?[469]|11)[\\\\-](0?[1-9]|[12][0-9]|30))"
				+ "|199[1345789][\\\\-](0?2[\\\\-](0?[1-9]|[12][0-8])|(0?[13578]|1[02])[\\\\-](0?[1-9]|[12][0-9]|3[01])|(0?[469]|11)[\\\\-](0?[1-9]|[12][0-9]|30)))";
		Pattern pattern = Pattern.compile(reg);
		Scanner s =new Scanner(System.in);
		System.out.print("请输入日期:");
		String str = s.nextLine();
		Matcher matcher=pattern.matcher(str);  
        if(matcher.matches()) 
        	System.out.println("日期合法"); 
        else  
        	System.out.println("日期不合法"); 
        s.close();
	}
}

测试输出

请输入日期:1996-02-08
日期合法

3.写出长度为8-10的用户密码(密码以26个字母开头、中间可以包含数字字符、26个字母、下划线)的正则式
Secret.java

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

public class Secret {
	public static void main(String[] args) {
		String reg = "([a-z]|[A-Z])([a-z]|[A-Z]|[0-9]|[_]){7,9}";
		Pattern pattern = Pattern.compile(reg);
		Scanner s =new Scanner(System.in);
		System.out.print("请输入用户密码:");
		String str = s.nextLine();
		Matcher matcher=pattern.matcher(str);  
        if(matcher.matches()) 
        	System.out.println("密码合法"); 
        else  
        	System.out.println("密码不合法");
        s.close();
	}
}

测试输出

请输入用户密码:1651655vsdvdb
密码不合法

以上是关于学习Java之正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

通过 Java 正则表达式提取 semver 版本字符串的片段

学习Java之正则表达式

java之学习正则表达式的分组功能及案例

2019-05-23 Java学习日记之正则表达式&常用工具类

Java之正则表达式在字符串中查找中文

java学习笔记-4 正则表达式