正则表达式

正则表达式

正则表达式的规则:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
String s = "6 4 8 1 9";
String[] s1 = s.split(" ");
int[] arr = new int[strArray.length];
for(int x=0;x<arr.length; x++)
{
arr[x] = Integer.parseInt(strArray[x]);
}
Arrays.sort(arr);
StringBuilder sb = new StringBuilder();
for(int x = 0; x<arr.length; x++)
{
sb.append(arr[x]).append(" ");
}
String result = sb.toString().trim();

替换

替换功能:
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的位置。
所以这是容易漏掉第一个的易错点