正则表达式
正则表达式的规则:
A:字符
x 字符x
\ 反斜线字符
\n 换行
\r 回车
B:字符类
[abc] a或b或c
[^abc] 除了a,b,c以外
[a-zA-Z] 所有字母
[0-9] 所有数字
C:预定义字符类
. 任何字符(需要用到.就要\.)
\d 等同于[0-9]
\D 同等与[^0-9]
\w 单词字符= [a-zA-Z_0-9]
D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界(不是单词字符的地方)
举例:hello world中的空格就是单词边界
E:Greedy 数量词
x? x,
不写了,自己查去
JAVA方法
public boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式
判断
Scanner sc = new Scanner(System.in);
String email = sc.nextLine();
String regex = "[a-zA-Z_0-9]+![a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]{2,3})+";
boolean flag = email.matcher(refex);
System,out.println("flag:"+flag);
分割
public string[] split(string regex)//
根据匹配给定的正则表达式来拆分此字符串
*此方法返回的数组包含此字符串的每个子字符串,
使用举例:
String s1 = “aa.bb.cc”;
String[] s1Array = s1.split(“\.”);
String s1 = "aa bb cc";
String[] s1Array = s1.split(" +");
String s1 = "C:\\Users\\王旭\\Desktop\\JAVA笔记\\12.正则表达式";
String[] s1Array = s1.split("\\\\");
*注意*:硬盘上的地址必须用\而不是一个\,所以此处用\\切割
注意:
1.”.”和“|”都是转义字符,必须得加”\“;
String.split(“\.”),这样才能正确的分隔开,不能用String.split(“.”);
String.split(“\|”),这样才能正确的分隔开,不能用String.split(“|”);
2.如果在一个字符串中有多个分隔符,可以用“|”作为连字符
排序
如果将一个字符串元素排序呢?
1.把字符串进行分割,得到一个字符串数组。
2.把字符串数组变换成int数组。
3.排序
4.将int数组组装成一个字符串
1 | String s = "6 4 8 1 9"; |
替换
替换功能:
String类的replaceAll(String regex,string replacement)
使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串
举例:屏蔽掉字符串中的敏感字符
String s = “+VX123456789”;
String regex = “\d”;
String ss = ““;
String result = s.replaceAll(regex,ss);
syso(result);
结果:+vx**
获取
获取:将字符串中的符合规则的子串取出
操作步骤:
1.将正则表达式封装成对象。
2.让正则对象和要操作的字符串相关联。
3.关联后,获取正则匹配引擎。
4.通过引擎对符合规则的子串进行操作,比如取出
Pattern和Matcher类
举例:
String str = “wow ming tian yao xia yu”;
String regex = "\\b[a-z]{3}\\b";
Pattern p = Pattern.compile(regex);//将规则封装成对象
Matcher m = p.matcher(str);//让正则对象和要作用的字符串相关联,获取匹配器对象
System.out.println("matches:"+m.matcher());//判断是否符合规则
while(m.find())//find将规则作用到字符串上,并进行符合规则的子串查找。
{
syso(m.group());//group用于获取匹配后的结果。
}
***注意,此处打印出的只有yao xia两个,而没有wow。
why?
因为之前调用了一次matcher()方法进行了一次符合判定,
matcher()因为接收到空格而判断为false。
但是匹配器的索引位置却已经过了wow的位置。
所以这是容易漏掉第一个的易错点