正则表达式学习笔记

首先必须分享一个爆赞的正则表达式的分析网站,并且支持中文界面!
链接:https://regex101.com/

在这里插入图片描述
如何设置中文界面呢?点击这里设置
在这里插入图片描述
然后在language的下拉列表选择Chinese!
在这里插入图片描述
我们可以使用该网站慢慢写正则表达式,匹配了会分组挨个高亮显示,比在IDE里面debug快捷方便多了!!!

1⃣️matcher用法,匹配以020-加上8位数字的字符串,如果字符串以020-开头,后面是8位数字,则匹配成功

public static void main(String[] args) {
        String pattern = "020-\\d{8}";
        System.out.println("请输入一个广州的电话号码");
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()){
            String line = sc.nextLine();
            if (line.matches(pattern)){
                System.out.println("请火速🔥汇款30万元以立即购买,否则失去发财机会!!");
                System.out.println("请再次输入");
            }else {
                System.out.println("输入的电话号码无效");
                System.out.println("请再次输入");
            }
        }
    }

2⃣️java的split的要注意的一个问题

public static void main(String[] args) {
        String p = "\\.";
        String str = "fkit.org";
        String[] res1 = str.split(p);//以.作为分隔符
        String[] res2 = str.split(".");//以任意字符作为分隔符,正则表达式中,"."匹配任何字符
        System.out.println(res2.length==0);// true,因为是以任意字符为分隔符,所以根本分解不了!!
        System.out.println("以.作为分隔符");
        for(var i:res1){
            System.out.println(i);
        }
        System.out.println("以任意字符作为分隔符,因此res2是null,正则表达式中,\".\"匹配任何字符");
        for (var i:res2){
            System.out.println(i);
        }
    }

Java对正则表达式的支持
String 类:
matches(regex):判断该字符串是否匹配正则表达式
split(regex):根据指定分隔符将字符串分割成多段
replaceAll(regex,replacement):将regex匹配的内容替换replacement

3⃣️replaceAll用法,把出现英语的地方全部换成“钱”

public static void main(String[] args) {
        String s = "我爱Java,我爱凤姐,我爱编程";
        String r = s.replaceAll("[a-zA-Z]+", "钱");
        System.out.println(r);
    }

4⃣️成组匹配,必须一组一组的匹配

public static void main(String[] args) {
        System.out.println("abc".matches("(abc){1,2}"));
        System.out.println("abcc".matches("(abc){1,2}"));
        System.out.println("abcabc".matches("(abc){1,2}"));
    }

5⃣️⚠️⚠️⚠️匹配规则⚠️⚠️⚠️

{m,n} 前面的字符出现m~n次
{m,}前面的字符出现m~∞次
{,n}前面的字符出现0~n次
{n}前面的字符出现n次
^开头
$结尾

. 代表任意一个字符
\d 代表任意一个数字 digit
\D 代表任意一个非数字
\w 代表任意一个单词
\W 代表任意一个非单词
\s 代表任意一个空白
\S 代表任意一个非空白
[a-d] 范围:代表a、b、c、d任一字符
[adm] 枚举,代表a、d、m其中任一字符
[am4-6] 混合:代表a、m、4、5、6任一字符
[^a-d] 求否,代表不是a、b、c、d其中任一字符
[a-g&&[^c-e]]:求与,表示a、b、f、g其中任一一个字符

? :前面的字符可以出现0~1次
例如:a?b 可以代表b,ab

*:前面的字符出现0~N次
例如
1⃣️ a*b可以代表b,ab,aaab,aaaab
2⃣️ \d * 5可以代表5,345,345345
3⃣️[0-1]*5可以代表5,00005,01101015
+:前面的字符出现1~N次
a+b:可以代表ab,aaab,aaaaaaaab
\d+5可以代表345,345345
[0-1]+5可以代表000005,01101015

成组:
(abc){1,2}可以代表:abc,abcabc
((abc)|(123))* : 可以代表"" , abc123
((abc) * | (123)*):可以代表"" , abcabc , 123123

6⃣️Pattern和Matcher的用法

用于实现从文本中提取有效的信息,比如手机号码,提取之后随意使用

Pattern就代表了正则表达式

String s = "1(([35][0-9])|(47)|(9[0-35-9]))\\d{8}";//电话号码
Pattern p = Pattern.compile(s);//编译一个正则表达式
Matcher m = p.matcher(line);//假设line是一个io流中一行一行读取的String的java对象
// Matcher的创建对象这一行就代表了从line中提取出p正则表达式匹配的字符串!!!

7⃣️group分组

在这里插入图片描述

2021年11月4日更~~~~~~~~~~~~~~~~~~~~~~~~~~~

(一)通过序号查找分组group

在这个代码中,因为有2对(),所以分成了2组,并且第一对()对应第一组group(1),第二组()对应第二组group(2),而group对应的是匹配的整个字符串。

样例 1 样例1 样例1

    public static void main(String[] args) {
        String cnt = "kasldjklas s7789 nn1189asdk";
        String regstr = "(\\d\\d)(\\d\\d)";
        Matcher m = Pattern.compile(regstr).matcher(cnt);
        while (m.find()){
            System.out.println("Res = " + m.group(0));
            System.out.println("Group 1 is " + m.group(1));
            System.out.println("Group 2 is " + m.group(2));
        }
    }

每次匹配4个数字,
第一次匹配的整个字符串是7789,7789里面有2组,第一组是77,第二组是89
第二次匹配的整个字符串是1189,1189里面有2组,第一组是11,第二组是89
运行结果 运行结果 运行结果
在这里插入图片描述

样例 2 样例2 样例2
跟上面的一样,分组多了一个,可以跟样例1一起搭配理解

    public static void main(String[] args) {
        String cnt = "hanshunping s7789 nn1189han";
        String regstr = "(\\d\\d)(\\d)(\\d)";
        Matcher m = Pattern.compile(regstr).matcher(cnt);
        while (m.find()){
            System.out.println("Res = " + m.group(0));
            System.out.println("Group 1 is " + m.group(1));
            System.out.println("Group 2 is " + m.group(2));
            System.out.println("Group 3 is " + m.group(3));
        }
    }

运行结果 运行结果 运行结果
在这里插入图片描述

(二)通过命名查找分组group

P S PS PS:通过分组的序号和通过命名来查找分组本质上是一样的,都是先找到匹配的整个字符串,再通过()分组,来把匹配的字符串分成一小组,一小组,只不过一种是给小组排了序号,另外一种是直接就给分组起了名字.

    public static void main(String[] args) {
        String sql = "kasldjklas s7789 nn1189asdk";
        Matcher m = Pattern.compile("(?<g1>\\d\\d)(?<g2>\\d\\d)").matcher(sql);
        while (m.find()){
            System.out.println("找到的匹配的整个字符串 = "+m.group());
            System.out.println("第一个分组的内容 = " + m.group(1));
            System.out.println("第二个分组的内容 = " + m.group(2));

            System.out.println("通过组名,第一个分组的内容" + m.group("g1"));
            System.out.println("通过组名,第二个分组的内容" + m.group("g2"));

            System.out.println("-----------------------\n\n");
        }
    }

在这里插入图片描述

最后:参考的资料及视频如下:

传送门:👉group笔记参考的页面

传送门:👉韩顺平精解正则表达式

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dareu_4523

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值