大家好,我是【八戒,你又涨价了哎】
以下是我个人在 实习过程 中的分享,请大家多多指教
目录
7、匹配是否为二维整型数组,例如:[[1], [2, 3], [-4, 5]]
8、匹配是否为二维字符串数组,例如:[[ "apple" ], [ "banana", "cherry" ]]
9、匹配是否为二维字符串数组【2】,例如: [['hello', 'world'], ['foo', 'bar']]
10、将字符 串形式的二维字符数组 转化为 二维字符数组类型:
11、将字符 串形式的二维整型数组 转化为 二维整型数组类型:
12、将字符 串形式的二维整型数组 转化为 二维整型List集合(类似11,仅修改收集方式):
13、将字符 串形式的二维整型数组 转化为 二维字符串数组类型:
14、将 双精度浮点数转 化为 整数(有小数保留1位小数,若5.0保留5)
一、个人常用匹配规则
1. 元字符
元字符在正则表达式中有特殊的含义,用来控制匹配行为。常见的元字符包括:
-
.
(点号):
匹配任意字符,除了换行符。
例子:a.b
可以匹配aab
、acb
等。 -
^
(脱字符):
表示字符串的开头。
例子:^abc
只能匹配以abc
开头的字符串。 -
$
(美元符号):
表示字符串的结尾。
例子:xyz$
只能匹配以xyz
结尾的字符串。 -
[]
(字符类):
匹配字符集合中的任意一个字符。
例子:[abc]
可以匹配a
、b
、c
中的任意一个字符。 -
|
(或运算符):
表示或操作,匹配左侧或右侧的表达式。
例子:abc|def
可以匹配abc
或def
。 -
()
(捕获组):
用来分组,可以将多个字符组合成一个整体。
例子:(abc)+
表示abc
可以重复一次或多次。
2. 量词
量词用于指定匹配的次数:
-
*
:
匹配前面的表达式 0 次或多次。
例子:a*
可以匹配空字符串、a
、aa
等。 -
+
:
匹配前面的表达式 1 次或多次。
例子:a+
可以匹配a
、aa
等,但不能匹配空字符串。 -
?
:
匹配前面的表达式 0 次或 1 次。
例子:a?
可以匹配空字符串或a
。 -
{n}
:
匹配前面的表达式恰好 n 次。
例子:a{3}
只能匹配aaa
。 -
{n,}
:
匹配前面的表达式至少 n 次。
例子:a{2,}
可以匹配aa
、aaa
等。 -
{n,m}
:
匹配前面的表达式至少 n 次,至多 m 次。
例子:a{2,4}
可以匹配aa
、aaa
、aaaa
。
3. 字符类
字符类用于定义一组字符,可以在方括号内列出可能的字符:
-
[abc]
:
匹配a
、b
或c
中的任意一个字符。 -
[a-z]
:
匹配小写字母 a 到 z。 -
[^abc]
:
匹配除a
、b
、c
之外的任意字符。 -
\d
:
匹配任意数字,等同于[0-9]
。 -
\D
:
匹配非数字字符。 -
\w
:
匹配任意字母、数字或下划线字符,等同于[a-zA-Z0-9_]
。 -
\W
:
匹配非字母、非数字或非下划线字符。 -
\s
:
匹配任意空白字符(空格、制表符、换行符等)。 -
\S
:
匹配非空白字符。
4. 边界匹配
边界匹配器用于匹配特定的字符串位置,而不是具体的字符:
-
^
:
匹配字符串的开头。
例子:^Hello
只能匹配以Hello
开头的字符串。 -
$
:
匹配字符串的结尾。
例子:world$
只能匹配以world
结尾的字符串。 -
\b
:
匹配单词边界。
例子:\bword\b
只能匹配完整的word
,而不是sword
或wording
。 -
\B
:
匹配非单词边界。
5. 转义字符
如果要匹配元字符本身而不是它们的特殊含义,需要使用反斜杠 \
进行转义。
-
匹配点号(.):
\\.
-
匹配问号(?):
\\?
-
匹配星号(*):
\\*
6. 非贪婪模式
默认情况下,量词是贪婪的,会尽可能多地匹配字符。可以通过在量词后加上 ?
来使其变为非贪婪模式,只匹配最少的字符。
-
贪婪匹配:
.*
会匹配整个字符串。 -
非贪婪匹配:
.*?
只会匹配尽可能少的字符
7. 常用举例
1. 匹配数字
-
匹配任意数字(0-9):
\\d
-
匹配 n 位的数字:
\\d{n}
-
匹配至少 n 位的数字:
\\d{n,}
-
匹配 n 到 m 位的数字:
\\d{n,m}
-
匹配非数字字符:
\\D
2. 匹配字母
-
匹配任意小写字母(a-z):
[a-z]
-
匹配任意大写字母(A-Z):
[A-Z]
-
匹配任意大小写字母:
[a-zA-Z]
-
匹配字母数字(a-z, A-Z, 0-9):
[a-zA-Z0-9]
-
匹配非字母字符:
[^a-zA-Z]
二、个人常用匹配 以及 实际应用
1、匹配邮箱
String regex = "^[A-Za-z0-9+_.-]+@(.+)$";
2、匹配Ipv4地址
String regex = "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
3、匹配url
String regex = "^(http://|https://)?([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}(/\\S*)?$";
4、匹配手机号
String regex = "^1[3-9]\\d{9}$";
5、匹配身份证号
String regex = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))((0[1-9])|([1-2]\\d)|(3[0-1]))\\d{3}[0-9Xx]$";
6、匹配是否为一维整型数组,例如:[1, 2, 3]
literal.matches("\\[\\s*(-?\\d+\\s*,\\s*)*(-?\\d+)\\s*\\]")
7、匹配是否为二维整型数组,例如:[[1], [2, 3], [-4, 5]]
literal.matches(
"\\[\\s*((\\[\\s*(-?\\d+\\s*,\\s*)*(-?\\d+)\\s*\\]\\s*,\\s*)*(\\[\\s*(-?\\d+\\s*,\\s*)*(-?\\d+)\\s*\\]\\s*))\\]");
8、匹配是否为二维字符串数组,例如:[[ "apple" ], [ "banana", "cherry" ]]
literal.matches(
"\\[\\s*(\\[\\s*(\".*?\"\\s*,\\s*)*\".*?\"\\s*\\]\\s*,\\s*)*(\\[\\s*(\".*?\"\\s*,\\s*)*\".*?\"\\s*\\]\\s*)\\]");
9、匹配是否为二维字符串数组【2】,例如: [['hello', 'world'], ['foo', 'bar']]
return literal.matches(
"\\[\\s*((\\[\\s*'.*?'\\s*,\\s*)*(\\[\\s*'.*?'\\s*\\]\\s*))\\]");
10、将字符 串形式的二维字符数组 转化为 二维字符数组类型:
private static char[][] parse2DCharArray(String literal) {
// 使用正则表达式定义一个模式,用于匹配最外层的方括号中的内容
// \\[ 和 \\] 表示匹配 '[' 和 ']', 而 [^\\[\\]]+ 表示匹配除 '[' 和 ']' 之外的所有字符
Pattern pattern = Pattern.compile("\\[([^\\[\\]]+)\\]");
// 创建一个Matcher对象,通过传入的字符串 literal 查找符合正则表达式的子串
Matcher matcher = pattern.matcher(literal);
// 创建一个用于存储字符数组的列表,用于暂时保存解析出来的多个字符数组
List<char[]> list = new ArrayList<>();
// 使用 matcher.find() 循环遍历,找出所有符合正则表达式的子串
// 每次找到一个匹配的子串(也就是一对方括号中的内容),都进行处理
while (matcher.find()) {
// matcher.group(1) 获取匹配的方括号中的内容(不包括方括号本身)
// 将这部分内容传递给 parseCharArray 函数,将其解析为一个字符数组
list.add(parseCharArray(matcher.group(1)));
}
// 将存储在 list 中的所有字符数组转换为一个二维字符数组并返回
// toArray(new char[0][]) 是 Java 中将 List 转换为数组的常见写法
return list.toArray(new char[0][]);
}
// 解析单个字符数组的方法,负责将形如 "'a', 'b'" 的字符串解析为字符数组
private static char[] parseCharArray(String str) {
// 使用 split 方法将字符串按逗号分割,并去除逗号两侧的多余空格
// 分割后的结果会是字符串数组,如 ["'a'", "'b'"]
String[] elements = str.split("\\s*,\\s*");
// 创建一个字符数组,其长度与分割后的字符串数组相同
char[] chars = new char[elements.length];
// 遍历分割后的字符串数组,将每个字符串中的字符提取出来
for (int i = 0; i < elements.length; i++) {
// 每个元素形如 "'a'",使用 charAt(1) 提取第二个字符,即单引号内的字符
chars[i] = elements[i].charAt(1);
}
// 返回解析后的字符数组
return chars;
}
11、将字符 串形式的二维整型数组 转化为 二维整型数组类型:
// 解析一个形如 "[[1, 2], [3, 4]]" 的字符串,将其转换为一个二维整数数组 int[][]
private static int[][] parse2DArray(String literal) {
// 定义正则表达式,用于匹配最外层方括号中的内容
// \\[ 和 \\] 表示匹配 '[' 和 ']', [^\\[\\]]+ 匹配除方括号以外的所有字符
Pattern pattern = Pattern.compile("\\[([^\\[\\]]+)\\]");
// 使用正则表达式在输入的字符串 literal 中查找符合模式的子串
Matcher matcher = pattern.matcher(literal);
// 创建一个用于暂存一维整数数组的列表
List<int[]> list = new ArrayList<>();
// 使用 matcher.find() 循环遍历字符串,找出所有符合正则表达式的子串
// 每次找到一个匹配的子串(也就是一个方括号内的内容),就调用 parse1DArray 解析
while (matcher.find()) {
// 将每个匹配到的子串(即一维数组部分,如 "1, 2")传入 parse1DArray,解析为一维整数数组
list.add(parse1DArray(matcher.group(1)));
}
// 将 list 转换为二维整数数组 int[][],并返回结果
// new int[0][] 用于指定返回数组的类型,toArray 将 List 转换为数组
return list.toArray(new int[0][]);
}
// 解析形如 "1, 2, 3" 的字符串,将其转换为一维整数数组 int[]
private static int[] parse1DArray(String literal) {
// 定义正则表达式,用于匹配一个整数,可以包含负号
// -? 表示可选的负号,\\d+ 表示一个或多个数字
Pattern pattern = Pattern.compile("-?\\d+");
// 使用正则表达式在输入的字符串 literal 中查找所有整数
Matcher matcher = pattern.matcher(literal);
// 创建一个用于存储整数的列表
List<Integer> list = new ArrayList<>();
// 使用 matcher.find() 遍历查找到的所有整数
while (matcher.find()) {
// matcher.group() 获取匹配的整数字符串,并将其解析为 Integer 对象
list.add(Integer.parseInt(matcher.group()));
}
// 将 List<Integer> 转换为 int[] 并返回
// stream().mapToInt() 将 Integer 对象转换为原始 int 类型
return list.stream().mapToInt(Integer::intValue).toArray();
}
12、将字符 串形式的二维整型数组 转化为 二维整型List集合(类似11,仅修改收集方式):
private static List<List<Integer>> parse2DArrayToList(String literal) {
Pattern pattern = Pattern.compile("\\[([^\\[\\]]+)\\]");
Matcher matcher = pattern.matcher(literal);
List<List<Integer>> list = new ArrayList<>();
while (matcher.find()) {
list.add(parse1DArrayToList(matcher.group(1)));
}
return list;
}
private static List<Integer> parse1DArrayToList(String literal) {
Pattern pattern = Pattern.compile("-?\\d+");
Matcher matcher = pattern.matcher(literal);
List<Integer> list = new ArrayList<>();
while (matcher.find()) {
list.add(Integer.parseInt(matcher.group()));
}
return list;
}
13、将字符 串形式的二维整型数组 转化为 二维字符串数组类型:
private static String[][] parse2DStringArray(String literal) {
Pattern pattern = Pattern.compile("\\[([^\\[\\]]+)\\]");
Matcher matcher = pattern.matcher(literal);
List<String[]> list = new ArrayList<>();
while (matcher.find()) {
list.add(parseStringArray2(matcher.group(1)));
}
return list.toArray(new String[0][]);
}
private static String[] parseStringArray2(String literal) {
// 使用正则表达式匹配双引号内的内容,忽略其中的逗号
Pattern pattern = Pattern.compile("\"([^\"]*?)\"");
Matcher matcher = pattern.matcher(literal);
List<String> list = new ArrayList<>();
while (matcher.find()) {
list.add(matcher.group(1));
}
return list.toArray(new String[0]);
}
14、将 双精度浮点数转 化为 整数(有小数保留1位小数,若5.0保留5)
private static String formatDouble(Double value) {
// 检查是否为 null,如果是 null,返回空字符串
if (value == null) {
return "";
}
// 判断是否为整数
if (value == value.intValue()) {
return String.valueOf(value.intValue()); // 返回整数部分
} else {
// 确保使用统一的小数格式,保留一位小数
DecimalFormat df = new DecimalFormat("0.0");
return df.format(value); // 返回保留一位小数的字符串
}
}