正则表达式

本文深入探讨了正则表达式的各种用法,包括数量限定符、范围、预定义字符、边界、查找与分组等高级特性。通过具体示例,讲解了如何使用Java进行字符串匹配、查找、替换及分组操作。

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

package lib;

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

public class RegExp {
	public static void main(String[] args) {
		
		/**
		 数量:
		 	.	任何字符(与行结束符可能匹配也可能不匹配)
		 	X?	X,一次或一次也没有
			X*	X,零次或多次
			X+	X,一次或多次
			X{n}	X,恰好 n 次
			X{n,}	X,至少 n 次
			X{n,m}	X,至少 n 次,但是不超过 m 次
		 */
		System.out.println("a".matches("."));
		System.out.println("aa".matches("aa"));
		System.out.println("aaaaaa".matches("a*"));
		System.out.println("".matches("a*"));
		System.out.println(" ".matches("a*"));//不匹配一个空格, false
		System.out.println("aaaaaa".matches("a+"));
		System.out.println("".matches("a+"));//false
		System.out.println("aaaaaa".matches("a?"));//false
		System.out.println("".matches("a?"));
		System.out.println("a".matches("a?"));
		System.out.println("3413413413415".matches("\\d{3,100}"));
		System.out.println("192.168.0.107".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));
		System.out.println("192".matches("[0-9][0-9][0-9]"));
		
		/**
		    范围:
		    [abc]	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](减去)
		 */
		System.out.println("a".matches("[abc]"));
		System.out.println("a".matches("[^abc]"));//false
		System.out.println("A".matches("[^abcB-Z]"));
		System.out.println("A".matches("[a-z]|[A-Z]"));
		System.out.println("A".matches("[a-z[A-Z]]"));
		System.out.println("R".matches("[A-Z&&[RMN]]"));
		
		/**
		 * 预定义字符
		    \d	数字:[0-9]
			\D	非数字: [^0-9]
			\s	空白字符:[ \t\n\x0B\f\r]
			\S	非空白字符:[^\s]
			\w	单词字符:[a-zA-Z_0-9]
			\W	非单词字符:[^\w]
		 */
		System.out.println(" \n\r\t".matches("\\s{4}"));
		System.out.println("a".matches("\\S"));
		System.out.println("a_8".matches("\\w{3}"));
		System.out.println("adf3452&^%".matches("\\w{3}\\d+[%^&]+"));
		System.out.println("\\".matches("\\\\"));
		
		/**
		 * 边界:
		    ^	行的开头
			$	行的结尾
			\b	单词边界
		 */
		System.out.println("hello world".matches("^h.*"));
		System.out.println("hello world".matches(".*ld$"));
		System.out.println("hello world".matches("^h[a-z]{1,3}o\\b.*"));
		System.out.println("helloworld".matches("^h[a-z]{1,3}o\\\\b.*"));//false
		//匹配空白行
		System.out.println(" \n".matches("^[\\s&&[^\\n]]*\\n$"));
		
		/**
		 * find
		 * lookingat
		 */
		Pattern p2 = Pattern.compile("\\d{3,5}");
		String s = "123-1534-234-90";
		Matcher m2 = p2.matcher(s);
		System.out.println(m2.matches());//false
		
		System.out.println(m2.find());
		System.out.println(m2.start() + "-" + m2.end());//4-8
		
		m2.reset();
		System.out.println(m2.find());
		System.out.println(m2.start() + "-" + m2.end());//0-3
		
		System.out.println(m2.find());
		System.out.println(m2.start() + "-" + m2.end());//4-8
		
		System.out.println(m2.find());
		System.out.println(m2.start() + "-" + m2.end());//9-12
		
		System.out.println(m2.find());//false
		//每次都从头开始匹配
		System.out.println(m2.lookingAt());
		System.out.println(m2.start() + "-" + m2.end());//0-3
		System.out.println(m2.lookingAt());
		System.out.println(m2.start() + "-" + m2.end());//0-3
		System.out.println(m2.lookingAt());
		System.out.println(m2.start() + "-" + m2.end());//0-3
		
		/**
		 * 替换
		 */
		Pattern p3 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
		String str = "java java JAVA JAVa test_JAVA other";
		Matcher m3 = p3.matcher(str);
		int i = 0;
		StringBuffer sb = new StringBuffer();
		while(m3.find()) {
			i++;
			if(i%2 == 0) {
				m3.appendReplacement(sb, "python");
			}else {
				m3.appendReplacement(sb, "scala");
			}
		}
		m3.appendTail(sb);
		System.out.println(sb);
		System.out.println("JAVA".matches("(?i)(java)"));
		
		/*
		 * 分组 group
		 */
		Pattern p4 = Pattern.compile("((\\d{3,5})([a-z]{2}))");
		String s4 = "123aa-1534bb-234ss-90xx";
		Matcher m4 = p4.matcher(s4);
		while(m4.find()) {
			System.out.println(m4.group(3));
		}
		/*
		 * 不捕获分组
		 */
		Pattern pt = Pattern.compile(".{3}(?=a)");
		Matcher mt = pt.matcher("444a333b");
		while(mt.find()) {
			System.out.println(mt.group());//444
		}
		
		/**
		 * 向前引用
		 */
		Pattern pt3 = Pattern.compile("(\\d\\d)\\1");//1代表匹配第几个组的内容
		Matcher mt3 = pt3.matcher("1212");
		System.out.println(mt3.matches());
		Pattern pt4 = Pattern.compile("(\\d(\\d))\\2");//匹配第2个组的内容
		Matcher mt4 = pt4.matcher("122");
		System.out.println(mt4.matches());
		
		
		/*
		 * qulifiers
		 */
		Pattern p5 = Pattern.compile("(.{3,10})[0-9]");//{3,10}与[0,9]同时满足时的最大串情况
		String s5 = "aaaa3bbbb2";
		Matcher m5 = p5.matcher(s5);
		if (m5.find()) {
			System.out.println(m5.start()+"-"+m5.end());//0-10
		}
		Pattern p6 = Pattern.compile("(.{3,10}?)[0-9]");//{3,10}与[0,9]同时满足时的最小串情况
		String s6 = "aaaa3bbbb2";
		Matcher m6 = p6.matcher(s6);
		if (m6.find()) {
			System.out.println(m6.start()+"-"+m6.end());//0-5
		}
		Pattern p7 = Pattern.compile("(.{3,10}+)[0-9]");//{3,10}与[0,9]先要满足左边最大条件,然后满足右边条件
		String s7 = "aaaa3bbbb2";
		Matcher m7 = p7.matcher(s7);
		if (m7.find()) {
			System.out.println(m7.start()+"-"+m7.end());
		}
		
		
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值