正则表达式
在线正则校验链接 -----> RegexPal:在线正则表达式验证工具
在线正则练习链接 -----> Regex 101 - ZH-CN
一、简介
-
正则表达式定义了字符串的模式。
-
正则表达式可以用来搜索、编辑或处理文本。
-
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
二、Pattern
1、简介
必须首先将正则表达式(指定为字符串)编译为此类的实例。 然后将所得的图案可以被用来创建一个
Matcher
对象可以匹配任意character sequences
针对正则表达式。 执行匹配的所有状态都驻留在匹配器中,所以许多匹配者可以共享相同的模式。
2、Pattern.complie(常用)
将给定的正则表达式编译为模式。
如:非中文、非?、非?、非空格,校验
@Test
public void test03() {
String str = "1232_-?";
Pattern pattern = Pattern.compile("^[^\\u4e00-\\u9fa5^?^?^ ]+$");
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {
System.out.println("matcher.group() = " + matcher.group());
} else {
System.out.println("不支持中文、?、?、空格等字符!!!");
}
}
三、Matcher
1、简介
通过解释
Pattern
,执行上匹配操作的引擎character sequence
。通过调用模式的
matcher
方法从模式创建匹配器。 创建后,可以使用匹配器执行三种不同类型的匹配操作:
matches
方法尝试将整个输入序列与模式进行匹配。lookingAt
方法尝试将起始于输入序列的输入序列与模式进行匹配。find
方法扫描输入序列,寻找匹配模式的下一个子序列。这些方法中的每一个返回一个指示成功或失败的布尔值。 通过查询匹配器的状态可以获得有关成功匹配的更多信息。
此类的实例不能安全地被多个并发线程使用。
2、macher.find(常用)
尝试找到匹配模式的输入序列的下一个子序列。
- 成功,返回
true
。- 失败,返回
false
。
3、macher.group(常用)
3.1、macher.group()
返回与上一个匹配匹配的输入子序列。
默认调用:macher.group(0)
3.1、macher.group(int group)
返回在上一次匹配操作期间由给定组捕获的输入子序列。
如:regex(正则表达式)
中的每一个() 代表着一个给定组。
@Test
public void test04() {
String msg = "abcdefgh";
Pattern pattern = Pattern.compile("^(abc(def)gh)$");
Matcher matcher = pattern.matcher(msg);
if (matcher.find()) {
System.out.println("matcher.group() = " + matcher.group());
System.out.println("matcher.group(0) = " + matcher.group(0));
System.out.println("matcher.group(1) = " + matcher.group(1));
System.out.println("matcher.group(2) = " + matcher.group(2));
}
}
根据上述介绍,以下的结果可轻松理解:
macher.group()
等价于macher.group(0)
,输出匹配的全部内容。macher.group(1)
是输出了第一个给定组里的内容(abcdefgh)
,即:abcdefgh
macher.group(2)
是输出了第二个给定组里的内容(def)
,即:def
3.1、macher.group(String name)(推荐使用)
返回给定捕获的输入子序列之中的匹配操作序列。
如:regex(正则表达式)
中的每一个(?<>) 代表着指定名称的给定组。
@Test
public void test05() {
String msg = "abcdefgh";
Pattern pattern = Pattern.compile("^(?<msg1>abc(?<msg2>def)gh)$");
Matcher matcher = pattern.matcher(msg);
if (matcher.find()) {
System.out.println("matcher.group() = " + matcher.group());
System.out.println("matcher.group(\"msg1\") = " + matcher.group("msg1"));
System.out.println("matcher.group(\"msg2\") = " + matcher.group("msg2"));
}
}
根据上述介绍,以下的结果可轻松理解:
macher.group()
等价于macher.group(0)
,输出匹配的全部内容。macher.group("msg1")
是输出了指定名称的给定组里的内容(?<msg1>abcdefgh)
,即:abcdefgh
macher.group("msg2")
是输出了指定名称的给定组里的内容(?<msg2>def)
,即:def
四、项目实战
用正则表达式 + macher.group(String name)获取指定的错误信息:
Null Value!
错误消息如下:
String error1 = "Illegal Data= Null Value!";
String error2 = "Illegal Data= {Null Value!}";
String error3 = "[Null Value!]Illegal Data";
String error4 = "Illegal Data: Null Value!";
String error5 = "Illegal Data= [Null Value!]";
1、获取error1的Null Value!
@Test
public void test07() {
String error1 = "Illegal Data= Null Value!";
Pattern pattern1 = Pattern.compile("^Illegal\\s*Data=\\s*(?<msg>.+).*$");
Matcher matcher1 = pattern1.matcher(error1);
if (matcher1.find()) {
System.out.println("matcher1.group(\"msg\") = " + matcher1.group("msg"));
} else {
System.out.println("正则表达式未匹配到指定内容");
}
}
2、获取error2的Null Value!
@Test
public void test08() {
String error2 = "Illegal Data= {Null Value!}";
Pattern pattern1 = Pattern.compile("^Illegal\\s*Data=\\s*\\{(?<msg>.+)\\}.*$");
Matcher matcher1 = pattern1.matcher(error2);
if (matcher1.find()) {
System.out.println("matcher1.group(\"msg\") = " + matcher1.group("msg"));
} else {
System.out.println("正则表达式未匹配到指定内容");
}
}
3、获取error3的Null Value!
@Test
public void test09() {
String error3 = "[Null Value!]Illegal Data";
Pattern pattern1 = Pattern.compile("^\\s*\\[(?<msg>.+)\\]Illegal\\s*Data.*$");
Matcher matcher1 = pattern1.matcher(error3);
if (matcher1.find()) {
System.out.println("matcher1.group(\"msg\") = " + matcher1.group("msg"));
} else {
System.out.println("正则表达式未匹配到指定内容");
}
}
4、获取error4的Null Value!
@Test
public void test10() {
String error4 = "Illegal Data: Null Value!";
Pattern pattern1 = Pattern.compile("^Illegal\\s*Data:\\s*(?<msg>.+).*$");
Matcher matcher1 = pattern1.matcher(error4);
if (matcher1.find()) {
System.out.println("matcher1.group(\"msg\") = " + matcher1.group("msg"));
} else {
System.out.println("正则表达式未匹配到指定内容");
}
}
5、获取error5的Null Value!
@Test
public void test11() {
String error5 = "Illegal Data= [Null Value!]";
Pattern pattern1 = Pattern.compile("^Illegal\\s*Data=\\s*\\[(?<msg>.+)\\].*$");
Matcher matcher1 = pattern1.matcher(error5);
if (matcher1.find()) {
System.out.println("matcher1.group(\"msg\") = " + matcher1.group("msg"));
} else {
System.out.println("正则表达式未匹配到指定内容");
}
}