作用:一般用于模式字符串的匹配和搜索
用法:
对于字符串匹配
1:设计模式字符串,并将其compile成pattern
String pattern="abc";
Pattern mypattern=Pattern.compile(pattern);
2.用mypattern的matcher方法,得到匹配结果matcher
Matcher mymatcher=mypattern.matcher("abc");
if(mymatcher.matches()){
System.out.println("匹配上了捏");
}
Matcher mymatcher=mypattern.matcher("abc")中的“abc”不再是模式字符串,而是input(即你要用模式字符串去匹配的字符串)。
对于字符串搜索
1:设计模式字符串,对你想储存的字符串加个括号,这表示匹配结果matcher会以数组的形式储存满足括号里的内容,从而达到搜索指定字符串的目的
String pattern="@(abc)@";
Pattern mypattern=Pattern.compile(pattern);
如上图中abc被括号括起来,下面可以使用搜索到的内容。
2.用mypattern的matcher方法,得到匹配结果matcher
Matcher mymatcher=mypattern.matcher("@abc@");
while (mymatcher.find()){
System.out.println(mymatcher.group(0));
System.out.println(mymatcher.group(1));
}
运行结果:
首先,使用while(mymatcher.find())是搜索所有满足的字符串并输出,find()会返回Boolean类型的值,表示还有没有满足条件的字符串。
其次,group(0)储存的是匹配到的整个字符串,group(1)是从前往后第一个括号里匹配到的内容。如果模式字符串有其他的括号,那么依次类推,group(2)存的是第二个括号匹配到的内容,group(3)存的是第三个括号匹配到的内容……
正则表达式的书写:
1.字符间的连接直接缺省就好,如ab。
2.表示选择用|,a|b 就是要么是a,要么是b,满足一个就能匹配。不仅仅是字符,像abc|def,那么“abc”能匹配,“def”同样能匹配,这里也揭示了优先级顺序,|是要后于缺省的连接计算的。
3.零个或者多个相同字符连接用*,如a*,那么空,a,aa,aaa……都能匹配。同样适用于字符串,如(abc)*就可以匹配abc,abcabc,abcabcabc……
这里的括号表示*的作用域,有人会问,这个模式字符串要是用于字符串搜索岂不是会储存我原本不想要的字符串,对,是这样的。为了避免这种情况,我们可以写成(?:abc)*,在原本的基础上加个?:,表示我这个括号不是作为标记要储存的字符串用途的,里面的内容就不会被储存。
4.假设一种情况,某个位置可以是从a到z的任意字符,那岂不是要写成(a|b|c|d|e……|z)这么长的模式字符串。。。?为了方便起见,可以用[a-z]代替上面的串,同样,对于数字,直接用[0-9]就可以表示0到9的所有数字都可以匹配上,对于大写字符,[A-Z]。。。
5.其他。。
限制某个字符串连续出现次数:a{1,2}即表示a出现了1次或两次,1和2是可以修改的。
a+表示a连续出现1次或更多次。
\\d代替[0-9],
\\s代替空格,
\\w中的w表示word(个人理解),可以匹配大小写字符以及数字和下划线。
其他内容详见菜鸟教程https://www.runoob.com/java/java-regular-expressions.html