正则表达式


前情提要:

  • ⭐在java的正则表达式中,两个\\代表其他语言中正则表达式的一个\
  • ⭐贪婪模式和非贪婪模式
    • 📌贪婪模式:尽可能按照正则表达式匹配最大子字符串(JAVA默认是贪婪模式)
    • 📌非贪婪模式:按照正则表达式匹配最小子字符串

🍓元字符

🍒限定符
  • \\ 转义字符,用于转义正则表达式的特殊字符(.*+()$/\?[]^{}),也可以使用[]包裹特殊字符。
  • * 指定字符重复出现0次或n
    示例: (abc)* 表示包含任意多个abc的字符串,0次也行,如:123、abc、abcabc
  • + 指定字符重复出现1次或n
    示例: m+(abc)* 表示至少一个m开头的字符串,后面带0-多个abc,如:m、mabc、mmabc
  • ? 指定字符重复出现0次或1
    示例: m+abc? 表示至少一个m开头的字符串,后面带abc可出现0次或1次,如:mab、mabc、mmabc
    注意: 当此字符紧随其他限定符(*、+、?、{n}、{n,}、{n,m}),匹配模式为非贪婪匹配
  • {n} 指定字符必须出现n
    示例: [abcd]{3} 表示a、b、c、d任意字符必须出现3次,如:aaa、bbb、ccc、ddd、abc、acd、bcd
  • {n,} 指定字符至少出现n次
    示例: [abcd]{3,} 表示a、b、c、d任意字符至少出现3次,如:aaa、bbbb、ccccc、dddddd、abc、abcd、abcda
  • {n,m} 指定字符至少出现n次,但不能超过m次,包含边界
    示例: [abcd]{3,5} 表示a、b、c、d任意字符至少出现3次,但不能超过5次,如:aaa、bbbb、ccccc、abc、abcd、abcda
  • (?i) 查找字母不区分大小写
    示例: (?i)abc 表示abc不区分大小写,a(?i)bc 表示bc不区分大小写,a((?i)b)c 表示只有b不区分大小写
🍒选择匹配符

| 匹配 | 之前和之后的字符
示例: ab|cd 表示abcd两个子串

🍒分组组合和反向引用符
  • ⭐捕获分组:
    • 📌(partition) 非命名捕获
    • 📌(?<groupname>partition)(?'groupname'partition) 命名捕获
  • ⭐非捕获分组:
    • 📌(?:partition)
      示例: industr(?:y|ies),相当于industry|industriesindustr(y|ies)
    • 📌(?=partition)
      示例: Windows(?=95|98|NT|2000),可以匹配Windows 95、Windows 98、Windows NT、Windows 2000中的Windows
    • 📌(?!partition)
      示例: Windows(?!95|98|NT|2000),可以匹配除Windows 95、Windows 98、Windows NT、Windows 2000中以为的其他Windows
🍒字符匹配符
  • [] 可接收的字符列表
    示例: [efgh] 表示e、f、g、h任意1个字符
  • [^] 不接收的字符列表
    示例: [^abc] 表示除a、b、c以外的任意1个字符
  • ⭐连字符
    示例: A-Z 任意单个大写字母
  • . 匹配除\n以外的任意字符
    示例: a..ba开头以b结尾,中间包括两个任意字符,长度为4的字符串,如:aacb、a34b、a#*b
  • \\d 匹配单个数字字符,相当于[0-9]
    示例: \\d{3}(\\d)? 表示包含3个或4个数字的字符串,如:123、1234
  • \\D 匹配单个非数字字符,相当于[^0-9]
    示例: \\D(\\d)* 表示以单个非数字字符开头,后接任意个数字字符串,如:A、B1234
  • \\w 匹配单个数字、大小写字母以及下划线字符,相当于[0-9a-zA-Z_]
    示例: \\d{3}\\w{4} 表示以3个数字开头,后接4(0-9a-zA-Z)长度为7的字符串,如:123aabb、345a4d7
  • \\W 匹配单个非数字、大小写字母以及下划线字符,相当于[^0-9a-zA-Z_]
    示例: \\W+\\d{2} 表示以至少一个非数字字母字符开头,2个数字字符结尾的字符串,如:#12、$#*44
  • \\s 匹配任何空白字符(空格、制表符等)
  • \\S 匹配任何非空白字符(空格、制表符等)
🍒定位符
  • ^ 指定起始字符
    示例: ^[0-9]+[a-z]* 以至少一个数字开头,后接任意小写字母的字符串,如:1aa、1、1bb
  • $ 指定结束字符
    示例: ^[0-9]\\-[a-z]+$ 以至少一个数字开头,中间接-,后面接至少一个小写字母结尾,如:1-a、1-b
  • \\b 匹配目标字符串的边界
    示例: han\\b 表示可以匹配字符串尾部或者空格前面的han,如:aahan、aahan bbhan
  • \\B 匹配目标字符串的非边界

🍓分组、捕获、反向引用

  • ⭐分组
    一个()里面的东西我们称之为分组
  • ⭐捕获
    按照正则表达式从左往右数,第一个()标记分组1,第二个()标记分组2,依次类推
  • ⭐反向引用
    正则表达式内部引用使用\\组号,正则表达式外部引用使用$组号

🍓正则表达式的应用

🍒🍒日期字符串转换工具
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

	public static Date parse(String date) throws ParseException {
	    String format = null;
	    Locale locale = null;
	    if (date.matches("^\\d{4}-\\d{2}-\\d{2}$")) {
	        //2024-02-25
	        format = "yyyy-MM-dd";
	    } else if (date.matches("^\\d{4}/\\d{2}/\\d{2}$")) {
	        //2024/02/25
	        format = "yyyy/MM/dd";
	    } else if (date.matches("^\\d{4}\\.\\d{2}\\.\\d{2}$")) {
	        //2024.02.25
	        format = "yyyy.MM.dd";
	    } else if (date.matches("^\\d{4}\\d{2}\\d{2}$")) {
	        //20240225
	        format = "yyyyMMdd";
	    } else if (date.matches("^\\d{4}年\\d{2}月\\d{2}日$")) {
	        //2024年02月25日
	        format = "yyyy年MM月dd日";
	    } else if (date.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
	        //2024-2-25
	        format = "yyyy-M-d";
	    } else if (date.matches("^\\d{4}/\\d{1,2}/\\d{1,2}$")) {
	        //2024/2/25
	        format = "yyyy/M/d";
	    } else if (date.matches("^\\d{4}\\.\\d{1,2}\\.\\d{1,2}$")) {
	        //2024.2.25
	        format = "yyyy.M.d";
	    } else if (date.matches("^\\d{4}年\\d{1,2}月\\d{1,2}日$")) {
	        //2024年2月25日
	        format = "yyyy年M月d日";
	    } else if (date.matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$")) {
	        //2024-02-25 18:33:05
	        format = "yyyy-MM-dd HH:mm:ss";
	    } else if (date.matches("^\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}:\\d{2}$")) {
	        //2024/02/25 18:33:05
	        format = "yyyy/MM/dd HH:mm:ss";
	    } else if (date.matches("^\\d{4}\\.\\d{2}\\.\\d{2} \\d{2}:\\d{2}:\\d{2}$")) {
	        //2024.02.25 18:33:05
	        format = "yyyy.MM.dd HH:mm:ss";
	    } else if (date.matches("^\\d{4}\\d{2}\\d{2}\\d{2}\\d{2}\\d{2}$")) {
	        //20240225183305
	        format = "yyyyMMddHHmmss";
	    } else if (date.matches("^\\d{4}年\\d{2}月\\d{2}日\\d{2}时\\d{2}分\\d{2}秒$")) {
	        //2024年02月25日18时33分05秒
	        format = "yyyy年MM月dd日HH时mm分ss秒";
	    } else if (date.matches("^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
	        //2024-2-25 18-33-5
	        format = "yyyy-M-d H:m:s";
	    } else if (date.matches("^\\d{4}/\\d{1,2}/\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
	        //2024/2/25 18:33:5
	        format = "yyyy/M/d H:m:s";
	    } else if (date.matches("^\\d{4}\\.\\d{1,2}\\.\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
	        //2024.2.25 18:33:5
	        format = "yyyy.M.d H:m:s";
	    } else if (date.matches("^\\d{4}年\\d{1,2}月\\d{1,2}日\\d{1,2}时\\d{1,2}分\\d{1,2}秒$")) {
	        //2024年2月25日 18时33分5秒
	        format = "yyyy年M月d日H时m分s秒";
	    } else if (date.matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}$")) {
	        //2024-02-25 18:33:05.176
	        format = "yyyy-MM-dd HH:mm:ss.SSS";
	    } else if (date.matches("^\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}$")) {
	        //2024/02/25 18:33:05.176
	        format = "yyyy/MM/dd HH:mm:ss.SSS";
	    } else if (date.matches("^\\d{4}\\.\\d{2}\\.\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}$")) {
	        //2024.02.25 18:33:05.176
	        format = "yyyy.MM.dd HH:mm:ss.SSS";
	    } else if (date.matches("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$")) {
	        //2024-02-25T18:33:05
	        format = "yyyy-MM-dd'T'HH:mm:ss";
	    } else if (date.matches("^\\d{4}/\\d{2}/\\d{2}T\\d{2}:\\d{2}:\\d{2}$")) {
	        //2024/02/25T18:33:05
	        format = "yyyy/MM/dd'T'HH:mm:ss";
	    } else if (date.matches("^\\d{4}\\.\\d{2}\\.\\d{2}T\\d{2}:\\d{2}:\\d{2}$")) {
	        //2024.02.25T18:33:05
	        format = "yyyy.MM.dd'T'HH:mm:ss";
	    } else if (date.matches("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}$")) {
	        //2024.02.25T18:33:05.176
	        format = "yyyy-MM-dd'T'HH:mm:ss.SSS";
	    } else if (date.matches("^\\d{4}/\\d{2}/\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}$")) {
	        //2024/02/25T18:33:05.176
	        format = "yyyy/MM/dd'T'HH:mm:ss.SSS";
	    } else if (date.matches("^\\d{4}\\.\\d{2}\\.\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}$")) {
	        //2024.02.25T18:33:05.176
	        format = "yyyy.MM.dd'T'HH:mm:ss.SSS";
	    } else if (date.matches("^[A-Z][a-z]{2} [A-Z][a-z]{2} \\d{2} \\d{2}:\\d{2}:\\d{2} CST \\d{4}$")) {
	        //Sun Feb 25 18:33:05 CST 2024
	        format = "EEE MMM dd HH:mm:ss 'CST' yyyy";
	        locale = Locale.US;
	    } else if (date.matches("^[A-Z][a-z]{2} [A-Z][a-z]{2} \\d{2} \\d{2}:\\d{2}:\\d{2} GMT\\+08:00 \\d{4}$")) {
	        //Sun Feb 25 18:33:05 GMT+08:00 2024
	        format = "EEE MMM dd HH:mm:ss z yyyy";
	        locale = Locale.ENGLISH;
	    }
	    SimpleDateFormat sdf = null;
	    if (locale == null) {
	        sdf = new SimpleDateFormat(format);
	    } else {
	        sdf = new SimpleDateFormat(format, locale);
	    }
	    return sdf.parse(date);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值