正则表达式 从入门到入坑 完整版(包括力扣例题)

本文全面介绍了正则表达式,包括单个符号、快捷符号、分组匹配、Java中的应用,如判断、分割、替换和查找功能。深入探讨了贪婪匹配,并展示了如何通过Pattern和Matcher提升匹配效率。还提供了力扣题目和C++正则函数的应用实例。

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

正则表达式是一套标准,可以用于任何语言

一般用 ^正则表达式$ .表示单行匹配
但在java中是默认的,所以可以不加前后开头结尾符号。

匹配年份

在这里插入图片描述

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner s=new Scanner(System.in);
		String a=s.next();
		String ex="19\\d\\d";
		if(a.matches(ex)) System.out.println(1);
		else System.out.println(0);
	}

非零qq号;

String ex="^[1-9]\\d{6,9}$";
		String a="01111111";
		String b="44444444";
		System.out.println(a.matches(ex));
		System.out.println(b.matches(ex));
		

匹配时间:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		String ex="^([0-1][0-9]|[2][0-4])\\:([0-5][0-9])$";
		String a="12:26";
		System.out.println(a.matches(ex));

	}

一、单个符号

1、英文句点.符号:匹配单个任意字符。
(因为点代表任意一个字符,所以如果想输出点,就要转义用\.)
eg:String ex=“.*ong,.*ong\.”;

表达式t.o 可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。
2、中括号[]:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。
[…]只能匹配其中一个字符。
eg:[a-f0-9_]{6} 6个里面的字符(a-b和0-9和下划线)
表达式:t[abcd]n 只可以匹配:tan,tbn,tcn,tdn。不可以匹配:thn,tabn,tn等。
3、| 符号。相当与“或”,可以匹配指定的字符,但是也只能选择其中一项进行匹配。
(aaa|bbb)只能匹配aaa和bbb其中一个字符串
表达式:t(a|b|c|dd)n 只可以匹配:tan,tbn,tcn,tddn。不可以匹配taan,tn,tabcn等。
4、表示匹配次数的符号
在这里插入图片描述

表达式:[0—9]{ 3 } \— [0-9]{ 2 } \— [0-9]{ 3 } 的匹配格式为:999—99—999
因为—符号在正则表达式中有特殊的含义,它表示一个范围,所以在前面加转义字符\。
5、符号:^ 表示否,如果用在方括号内,^表示不想匹配的字符。

表达式:[^x] 第一个字符不能是x
6、\S符号:非空字符
7、\s符号:空字符,只可以匹配一个空格、制表符、回车符、换页符,不可以匹配自己输入的多个空格。
8、\r符号:空格符,与\n、\tab相同
在这里插入图片描述

二、快捷符号(重点)

d与D,w与W等为对立关系
1、\d表示[0—9]
2、\D表示[^0—9]表示非数字
3、\w表示[0—9A—Z_a—z]字母,数字,下划线
4、\W表示[^0—9A—Z_a—z]
5、\s表示[\t\n\r\f]只能匹配一个空白字符,(不能是两个空格)
6、\S表示[^\t\n\r\f]
7,[+|-|*/]
8. 修饰符.:点可以匹配任意一个字符
9. 修饰符:星号可以匹配任意个字符
10.修饰符+:可以匹配至少一个字符
11,修饰符 ?:可以匹配0或一个字符
12。修饰符{n}:可以匹配n个字符
13。修饰符{n,m}:可以匹配n到m个字符
14,。修饰符{n,}:可以匹配至少n个字符

三,分组匹配

(…)进行分组,在分组后,就可以提取括号内的内容
在这里插入图片描述
提取时间

public static void main(String[] args) {
		// TODO Auto-generated method stub
		String a="12:26";
		String ex="^([0-1][0-9]|[2][0-4])\\:([0-5][0-9])$";
		Pattern pattern=Pattern.compile(ex);
		Matcher matcher=pattern.matcher(a);
		if(matcher.matches())//匹配为true
		{
			String whole=matcher.group(0);
			String h=matcher.group(1);
			String m=matcher.group(2);
			System.out.println(whole);
			System.out.print(h+"小时");System.out.print(m+"分钟");
		
		}
	}

四、Java 中正则表达式的应用(重点)

1、判断功能

(最常用的功能)
public boolean matches(String regex)
案例:判断录入的手机号是否为13或者18开头

package Lemon;

import java.util.Scanner;

public class RegexDm {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入手机好:");
        String s = sc.nextLine();

        String regex = "1[38]\\d{9}";//定义手机好规则
        boolean flag = s.matches(regex);//判断功能
        System.out.println("flag:"+flag);
    }
}

2、分割功能

public String[] split(String regex)
案例:

package Lemon;

import java.util.Scanner;

public class RegexDm {
    public static void main(String[] args){
        String age = "18-24";//定义年龄范围
        String regex = "-";
        String[] strArr = age.split(regex);//分割成字符串数组

        int startAge = Integer.parseInt(strArr[0]);
        int endAge = Integer.parseInt(strArr[1]);

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的年龄:");
        int a = sc.nextInt();
        if (a >= startAge && a <= endAge){
            System.out.println("你就是我想找的");
        }else{
            System.out.println("滚");
        }
    }
}

在这里插入图片描述
在这里插入图片描述

3、替换功能

replace和replaceAll都有替换功能:
replace:使用字符串识别进行替换
replaceAll:优先使用正则表达式进行替换
String str=t.replaceAll("(\\s\\w+){3}\\.", " qiao ben zhong.");

public class 学习 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 String s = "12342jasfkgnas234";
	        //把字符串里面的数字替换成*
	        String regex = "\\d";
	        String ss = "*";
	        String result = s.replaceAll(regex,ss);
	        String result2 = s.replace(regex,ss);
	        System.out.println(result);//*****jasfkgnas***
	        System.out.println(result2);//12342jasfkgnas234
	}

}

在这里插入图片描述
在这里插入图片描述

4,查找功能

在这里插入图片描述

StringBuffer ans=new StringBuffer();
Pattern pt=Pattern.compile("(\\(\\w*\\))");
Matcher mt=pt.matcher(s);
		while(mt.find())//一个一个遍历
		{
			String val=map.getOrDefault(mt.group(1), "?");
//			s=s.replace(mt.group(1),val);
			mt.appendReplacement(ans,val);
		}
		mt.appendTail(ans);

五,贪婪匹配

正则表达式会默认使用贪婪匹配,尽可能多的向后匹配。
在这里插入图片描述
solution:使用?实现终止贪婪匹配
在这里插入图片描述
在这里插入图片描述

六,pattern,matcher提高匹配速度(同时可以提取分组)

使用pattern加快匹配,存放正则表达式
使用matcher提取分组。
反复使用一个正则表达式字符串匹配,效率较低。
把正则表达式字符串编译成Pattern对象:

	 String ex="^([0-1][0-9]|[2][0-4])\\:([0-5][0-9])$";
		Pattern pattern=Pattern.compile(ex);
		String a="12:26";
		System.out.println(pattern.matcher(a).matches());

在这里插入图片描述
matcher其他常用类:
1,mt.appendReplacement(st1,st2);替换其中的内容,
2,mt.appendTail(ans);把mt的内容给ans

StringBuffer ans=new StringBuffer();
Pattern pt=Pattern.compile("(\\(\\w*\\))");
Matcher mt=pt.matcher(s);
		while(mt.find())//一个一个遍历
		{
			String val=map.getOrDefault(mt.group(1), "?");
//			s=s.replace(mt.group(1),val);
			mt.appendReplacement(ans,val);
		}
		mt.appendTail(ans);

提取时间

public static void main(String[] args) {
		// TODO Auto-generated method stub
		String a="12:26";
		String ex="^([0-1][0-9]|[2][0-4])\\:([0-5][0-9])$";
		Pattern pattern=Pattern.compile(ex);
		Matcher matcher=pattern.matcher(a);
		if(matcher.matches())//匹配为true
		{
			String whole=matcher.group(0);
			String h=matcher.group(1);
			String m=matcher.group(2);
			System.out.println(whole);
			System.out.print(h+"小时");System.out.print(m+"分钟");
		
		}
	}

其他综合例题

字符串后面有几个零

public class 几个零 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String a="apple win 29000";
//		String ex="^\\d+?(0*)$";
//		String ex="^\\w?\\d+?(0*)$";
		String ex="^[\\w\\s]+?(0*)$";
		Pattern p=Pattern.compile(ex);
		Matcher m=p.matcher(a);
		if(m.matches())
		{
			String ans=m.group(1);
			System.out.println(ans.length());
		}
	}
}

力扣1804

在这里插入图片描述

import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Solution {
    public String evaluate(String s, List<List<String>> knowledge) {
      StringBuilder ans=new StringBuilder();
		Map<String,String> map=new HashMap<>();
		for(List<String> temp:knowledge)
		{
			map.put("("+temp.get(0)+")",temp.get(1));
		}
//		Pattern pt=Pattern.compile("\\((\\w*)\\)");
		Pattern pt=Pattern.compile("(\\(\\w*\\))");
		Matcher mt=pt.matcher(s);
		while(mt.find())//一个一个遍历
		{
			String val=map.getOrDefault(mt.group(1), "?");
//			s=s.replace(mt.group(1),val);
			mt.appendReplacement(ans,val);
		}
		mt.appendTail(ans);
        return ans.toString();
    }
}

C++ 的正则表达式函数:

regex pat(“正则表达式”);
regex_match(str,pat) 返回true/false;

#include<bits/stdc++.h>
using namespace std;

int main(){
    string ip;
    regex pt("((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\.){4}");//匹配0.0.0.0.-255.255.255.255.的正则表达式
    while(getline(cin, ip)){
        ip += "."; //正则表达式匹配的四个点,ip地址后面再加一个
        if(regex_match(ip, pt)) //匹配函数
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值