前情提要:
- ⭐在
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
开头的字符串,后面带ab
,c
可出现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
表示ab
和 cd
两个子串
🍒分组组合和反向引用符
- ⭐捕获分组:
- 📌
(partition)
非命名捕获 - 📌
(?<groupname>partition)
或(?'groupname'partition)
命名捕获
- 📌
- ⭐非捕获分组:
- 📌
(?:partition)
示例:industr(?:y|ies)
,相当于industry|industries
、industr(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..b
以a
开头以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);
}