14.第十三节demo7-----大佬使用的正则表达式,作为菜鸟力求看明白,内容求大佬指正

    xiaoxiao2025-01-07  56

    package com.zzh.day2; import java.util.regex.Matcher; import java.util.regex.Pattern; /* * img/SpecialConstructs.png * */ public class demo7 { public static void main(String[] args) { // String string = "444a66ba"; String string = "456a78ba"; /* * 解释一下:这里(?=a)应该是不捕获等于a的这个字符,然而在a78这个位置,已经可以匹配到a这个字符,已经属于能匹配该正则表达式的字符串 * 故a不捕获,然而又从不捕获但属于匹配位置的地方开始匹配三个字符,即是a78 * */ Pattern p1 = Pattern.compile("(?=a).{3}");//不捕获的意思 Matcher m1 = p1.matcher(string); if (m1.find()) { System.out.println("m1 "+m1.group());//输出a78 } /* * 解释一下,没什么好解释的,就是不捕获a,并且下一次匹配的位置从这个a开始,,所以是444 66b * 若正则表达式改成.{4}(?=a),,则匹配到的字符串就是a66b,这样,,就更明显了 * */ Pattern p2 = Pattern.compile(".{3}(?=a)"); Matcher m2 = p2.matcher(string); while(m2.find()){ System.out.println("m2 "+m2.group());//输出456 78b } /*456a78ba * 解释一下:顾名思义,就是匹配不是a的,从头开始,56a7,7不是a,8ba最后什么也没有,也不是a,故匹配到56a 8ba * */ Pattern p3 = Pattern.compile(".{3}(?!a)"); Matcher m3 = p3.matcher(string); while(m3.find()){ System.out.println("m3 "+m3.group());//56a 8ba } /*456a78ba * 解释一下:前面不是a * 开始,4,不是a,匹配,然后这个4不捕获,从4开始找3个字符,即是456 * 继续,a,不匹配,后移,7,不是a,匹配,不捕获,从7开始找3个字符,即是78b * */ Pattern p4 = Pattern.compile("(?!a).{3}"); Matcher m4 = p4.matcher(string); while(m4.find()){ System.out.println("m4 "+m4.group());//456 78b } /*a456a78ba * 解释一下:对于每个匹配的片段的方式来讲,和.{3}(?!a)是反过来的, * * */ Pattern p5 = Pattern.compile(".{3}(?<!a)"); Matcher m5 = p5.matcher(string); while(m5.find()){ System.out.println("m5 "+m5.group());//456 a78 } /* * 解释一下: * */ Pattern p6 = Pattern.compile("(?<!a).{3}"); Matcher m6 = p6.matcher(string); while(m6.find()){ System.out.println("m6 "+m6.group());//456 a78 } /*456a78ba * 解释一下: * */ Pattern p7 = Pattern.compile("(?<=a).{3}"); Matcher m7 = p7.matcher(string); while(m7.find()){ System.out.println("m7 "+m7.group());//78b } /*456a78ba * 解释一下:可以这么想,456a是匹配这个正则表达式的,然而 * */ Pattern p8 = Pattern.compile(".{3}(?<=a)"); Matcher m8 = p8.matcher(string); while(m8.find()){ System.out.println("m8 "+m8.group());//56a 8ba } /*back references * 向前引用\\1 代表第一个组(没错,是第一个组,\\2表示第二组)捕捉之后的那个字符串,相同才是true * */ Pattern p9 = Pattern.compile("(\\d\\d)\\1([a-z][a-z])\\2"); String s = "1212abab"; Matcher m9 = p9.matcher(s); System.out.println(m9.matches()); //不区分大小写 Pattern p10 = Pattern.compile("java",Pattern.CASE_INSENSITIVE); Pattern p10_ = Pattern.compile("(?i)(java)");//(?i)的意义在SpecialConstructs.png //以上两个正则表达式的匹配的意义是相同的 System.out.println(p10.matcher("JAVA").matches()); System.out.println(p10_.matcher("JAVA").matches()); } }

    输出结果:

    m1 a78 m2 456 m2 78b m3 56a m3 8ba m4 456 m4 78b m5 456 m5 a78 m6 456 m6 a78 m7 78b m8 56a m8 8ba true true true

    路过的大佬,这篇文里面错误或者不准确的地方,跪求指正!

    最新回复(0)