正则表达式学习笔记

正则表达式

  • 1⃣️matcher用法,匹配以020-加上8位数字的字符串,如果字符串以020-开头,后面是8位数字,则匹配成功
  • 2⃣️java的split的要注意的一个问题
  • 3⃣️replaceAll用法,把出现英语的地方全部换成“钱”
  • 4⃣️成组匹配,必须一组一组的匹配
  • 5⃣️⚠️⚠️⚠️匹配规则⚠️⚠️⚠️
  • 6⃣️Pattern和Matcher的用法
  • 7⃣️group分组
    • (一)通过序号查找分组group
    • (二)通过命名查找分组group
  • 最后:参考的资料及视频如下:

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分组

正则表达式学习笔记_第1张图片

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 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));
        }
    }

运 行 结 果 运行结果
正则表达式学习笔记_第3张图片

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

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

    public static void main(String[] args) {
        String sql = "kasldjklas s7789 nn1189asdk";
        Matcher m = Pattern.compile("(?\\d\\d)(?\\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");
        }
    }

正则表达式学习笔记_第4张图片

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

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

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

你可能感兴趣的:(Java,正则表达式,前端,后端)