正则表达式:符合一定规则的表达式。
作用:专门操作字符串。
特点:用一些特定的符号来表示一些代码操作,这样就简化书写。
学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性极差。
具体操作功能:
1.匹配:String matches()方法
Greedy 数量词 | ||||
X? | X,一次或一次也没有 | |||
X* | X,零次或多次 | |||
X+ | X,一次或多次 | |||
X{n} | X,恰好 n 次 | |||
X{n,} | X,至少 n 次 | |||
X{n,m} | X,至少 n 次,但是不超过 m 次 | |||
字符类 | ||||
[abc] | a、b 或 c(简单类) | |||
[^abc] | 任何字符,除了 a、b 或 c(否定) | |||
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) | |||
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) | |||
[a-z&&[def]] | d、e 或 f(交集) | |||
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) | |||
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) | |||
|
| |||
预定义字符类
| ||||
. | 任何字符(与行结束符可能匹配也可能不匹配) | |||
\d | 数字:[0-9] | |||
\D | 非数字: [^0-9] | |||
\s | 空白字符:[ \t\n\x0B\f\r] | |||
\S | 非空白字符:[^\s] | |||
\w | 单词字符:[a-zA-Z_0-9] | |||
\W | 非单词字符:[^\w] |
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 | ((A)(B(C))) |
2 | \A |
3 | (B(C)) |
4 | (C) |
2.切割:String split()
按照多个空格来切
“ +”即空格加上“+”表示一次或多次
按照点来切
“\\.”必须加上两个转义字符
按照\\来切
“\\\\”必须是四个
按照叠词来切割
“(.)\\1”
为了可以让规则的结果被重用,可以将规则封装成一个组。
用( )完成,组的出现都有编号。
从1开始,想要使用已有的组可以用\n(n就是组的编号)的形式来获取。
判断表达式有多少个组可以用左括号来判断,一个左括号代表一个组,
从左往右数,左边第一个左括号,即为第一个组,
以此类推。
3.替换:String replaceAll()
把5个以上的数字装换成#
String s = s.replaceAll(“\\d{5,}”,”#“)
把叠词替换成&
String s = s.replaceAll(“(.)\\1+”,”&”)
把重叠的字符替换成单个字字符如:zzzz===>z
String s = s.replaceAll(“(.)\\1+”,”$1”)用$获取组的字符,1代表第一个组。
4.获取:
把规则封装成对象:Pattern p = Pattern.compile(regex);
让正则对象和要作用的字符串相关联,获取匹配器对象
Matcher m = p.matcher(str);
Syso(m.matcher);得到boolean型的值
其实Sting类中的matcher方法,用的就是Pattern和Matcher的对象来完成,只不过被String的方法封装后,用起来较为简单,但是功能单一。
While(m.find())
{
Syso(m.group());
}
find():查找与模式相匹配的子串
group():返回所匹配的子串
如果m.matcher先匹配,再使用m.find();
会从m.matcher匹配后的子串查找,
如:有10个字符,matcher读到了第三个字符,返回false后,
find()会从第四个字符开始查找。
边界匹配器 | |
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
四种功能到底使用哪一个?或者哪几个?
思路方式:
1.如果只是想知道该字符是否对或错,使用匹配。
2.想要将已有的字符串变成另一个字符串,使用替换。
3.想要按照自定的方式把字符串变成多个字符串。使用切割,获取规则以外的子串。
4.想要拿到符合需求的字符串子串,使用获取。获取符合规则的字符串。
示例:
写一个正则表达式,可以匹配尾号5连的手机号。
规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。
例如:18601088888、13912366666
代码:
package com.itheima;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test6 {
public static void main(String[] args) {
//思路:后五位为任意相同数字则需要用到组
//输入提示
System.out.println("请输入手机号:");
//键盘录入一个手机号
Scanner in = new Scanner(System.in);
//用字符串接收
String str = in.nextLine();
//写正则表达式
String regx="1[3458]\\d{4}(\\d)\\1{4}";
//把规则封装成对象
Pattern p = Pattern.compile(regx);
//判断字符串是否符合规则
Matcher m = p.matcher(str);
//输出判断结果
System.out.println("结果为:"+m.matches());
}
}