正则表达式详细笔记,Java

本文详细介绍Java中正则表达式的使用方法,包括基本概念、常用类介绍、匹配技巧及实际应用案例。通过具体示例讲解如何进行文本匹配、替换以及分组处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1. 正则表达式是一种匹配和处理文本的字符串
2. Java中相关的类: String类,Pattern类,Matcher类。
3. 指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意 字符序列 匹配。执行匹配所涉及的所有状态都驻留在匹配器中, 所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是:
Pattern p = Pattern. compile ("a*b"); // 将给定的正则表达式编译到模式中,以后使用时会更快,也方便于使用Pattern类的一些方法 Matcher m = p. matcher ("aaaaab"); // 创建匹配给定输入与此模式的匹配器;执行匹配所涉及的所有状态都驻留在匹配器中 boolean b = m. matches ();
等价于: boolean b = Pattern.matches("a*b", "aaaaab");
// 使用这种方法要注意:第一个参数是正则表达式
等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式

4. 匹配纯文本

5. . * + ?
X?X,一次或一次也没有
X*X,零次或多次
X+X,一次或多次

5. 匹配的并不总是整个字符串

6. 困难在于验证其不会匹配到不想要的字符串

7. 字符 集合 常用在不需要区分大小写的地方 [Rr]eg[Ee]x ,可以用^字符来取非

// 注:在定义一个字符 区间 时,一定要使尾字符大于首字符,否则模式是没有意义的
(如:[9-5],是没有意义的)

8. 示例:
System.out.println(Pattern.matches("[\\d&&[68]][\\d&&[68]][\\d&&[68]]","686"));
System.out.println("na1.xls".matches("[ns]a.\\.xls"));
9.
POSIX 字符类(仅 US-ASCII)
Unix中的标准

11. JavaScript中不支持在正则表达式中使用POSIX字符类

12. * + 是贪婪型元字符(*与+都是首先读取最多书屋字符,但是*会从后吐出不匹配的字符,即尽可能从开头匹配到末尾;但是+不会吐出,即+后面的表达式可能用不上)。表达式加上?变为懒惰型字符(从开头匹配,一旦匹配出符合表达式的子字符串就结束)
eg:
对于字符串"abcd3efg2A1"
使用表达式".{1,11}\\d",检测结果为:abcd3efg2A1
而使用".{1,11}?\\d",检测结果为:abcd3 efg2 A1
使用".{1,11}+\\d",匹配错误

// 综合示例:
System.out.println(m.matches());
		System.out.println(Pattern.matches("[\\d[68]][\\d[68]][\\d[68]]","686"));
		System.out.println("na1.xls".matches("[ns]a.\\.xls"));	
		p("A_1_23".matches("\\w{6,}"));
		p("abcW_%**123456 123".matches("\\w{5}[%*&]+\\d{6,}\\s\\d+"));
		p("\\".matches("\\\\"));
		p("4".matches("[3-5]"));
		p("123-".matches("\\d+-"));// - 字符不需要被转义
		p("ww&?123".matches("[^0-9]{2,}\\d+"));
		p("dgsrebesf".matches("\\p{Alpha}{5,10}"));// 
		p("hello world".matches("^h[a-z]{1,3}o\\b\\s\\w+ld$"));// 边界匹配器
		p("ben.sichuan@wanghai.123.com".matches("[\\w.]+\\.\\w+@\\w+[\\w\\.]+\\w+"));
		//贪婪型元字符(尽可能从开头匹配到末尾)
		p("<B>AK</B> and <B>HI</B>".matches("<[B]>.*</[B]>"));
		//懒惰型元字符(从开头匹配,匹配出一个就结束)
		p("<B>AK</B> and <B>HI</B>".matches("<[B]>.*?</[B]>"));
		p("   \n".matches("^[\\s&&[^\\n]]*\\n$"));// 匹配空格换行
public static void p(Object o){
	System.out.println(o);

13. Macher类:
matches 方法尝试将 整个 输入序列与该模式匹配。
lookingAt 尝试将输入序列 从头开始 与该模式匹配。
find 方法扫描输入序列以查找与该模式匹配的 下一个子序列 。如果匹配成功,则可以通过 start end group 方法获取更多信息
// find 方法是贪婪型的——对于"\\d{2,5}",find方法会尽量检测5个数字
reset 方法重置匹配器(避免matches方法与find方法之间产生冲突)
// 示例:
Pattern p=Pattern.compile("\\d{2,5}");
Matcher m=p.matcher("00005----1s11115222225s35");
//System.out.println(m.matches());
//m.reset(); // 重置
p(m.find());
p(m.find());
p(m.find());
p("第三个子字符串开始于:"+m.start()+"结束在"+m.end());
p(m.find());
// 注:四个结果都是true,00005----1s11115222225s35中的“1s”会被忽略,find在与其检测匹配的子字符串返回true ,所以222225中最后的“5”也被忽略,从而直接s35

14. 实例:查找Java并替换,并显示字符串尾巴
Pattern p=Pattern.compile("java",Pattern.CASE_INSENSITIVE);
		Matcher m=p.matcher("Java java JAVA jaVA vajava  JAvaa kjafhjavak  tail");
		StringBuffer buf=new StringBuffer();
		int i=0;
		while(m.find()){
			i++;
			if(i%2==1)
			m.appendReplacement(buf, "java");
			else
				m.appendReplacement(buf, "JAVA");
		}
		m.appendTail(buf);
		p(buf);


15. 正则表达式分组:用“()”分,分组是由序号的,从左往右数(应用于将查找到的结果分开显示)
也称之为子表达式,可以简化正则表达式的写法
eg:
  • (\\d{1,5})([a-z]{2,3}) 该正则表达式匹配到符合的语句后,可以在group()方法中设置参数,以单独显示匹配到的语句中的数字、字母
  • (\\d{3}\\.){2}(\\d.)\\d等价于\\d{3}\\.\\d{3}\\.\\d\\.\\d
  • 表达式20|19\\d{2}并不会找出20或21世纪的年份(如2017),只会找到20或19**,因为“|”将其前面或后面的表达做为一个整体看待(一个是20,另一个是19\\d{2}),正确的写法是:(20|19)\\d{2}

16. 示例:查找出文件中可能的手机号码:
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetEmail {
	static int k=0;
	public static void main(String[] args) throws FileNotFoundException {
		BufferedReader br=new BufferedReader(
				new FileReader("view-source_tieba.baidu.com_p_3977844275.html"));
		String line="";
		int i=1;
		try {
			while((line=br.readLine())!=null){
				getEmail(line);
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		System.out.println("共找到 "+k+" 个类似于手机号码的11位数字");
	}
	public static void getEmail(String line){
		Pattern p=Pattern.compile("1[3578][\\d]{9}");
		Matcher m=p.matcher(line);

		while(m.find()){
			k++;
			System.out.println(m.group()); 
		}
	}
}


17. 单词边界
表达式“find”会找到*find*
“\bfind”会找到find*
“\bfind\b”会找到find
字符串边界:^匹配字符串开头位置,$匹配字符串结尾

18. 分行匹配模式:(?m)会将行分隔符当做一个字符串分隔符对待,比如匹配注释语句时可以用到

19. 前后查找操作符:
正向前查找:?= 正向后查找:?<m=
负向前查找:?! 负向后查找:?<!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值