Java基础——正则表达式

正则表达式

在线正则校验链接 -----> 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、简介

  1. 通过解释Pattern,执行上匹配操作的引擎character sequence

  2. 通过调用模式的matcher方法从模式创建匹配器。 创建后,可以使用匹配器执行三种不同类型的匹配操作:

    • matches方法尝试将整个输入序列与模式进行匹配。
    • lookingAt方法尝试将起始于输入序列的输入序列与模式进行匹配。
    • find方法扫描输入序列,寻找匹配模式的下一个子序列。

    这些方法中的每一个返回一个指示成功或失败的布尔值。 通过查询匹配器的状态可以获得有关成功匹配的更多信息。

  3. 此类的实例不能安全地被多个并发线程使用。

2、macher.find(常用)

尝试找到匹配模式的输入序列的下一个子序列。

  • 成功,返回true
  • 失败,返回false

3、macher.group(常用)

3.1、macher.group()

返回与上一个匹配匹配的输入子序列。

默认调用:macher.group(0)

macher.group()

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

macher.group(int group)

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)

四、项目实战

正则表达式 + 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("正则表达式未匹配到指定内容");
    }
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值