正则表达式
正则表达式又称规则表达式,正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
定义
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。
符号:
1、 字符
x | 字符x |
\\ | 反斜线字符 |
\n | 换行 |
\r | 回车符 |
\f | 换页符 |
\e | 转义符 |
\t | 制表符 |
2、字符类
[abc] | a、b或c(简单类) | |
[^abc] | 任何字符,除了a、b或c(否定) | |
[a-zA-Z] | a到z或A到Z ,两头的字母包含在类(范围) | |
[0-9] | 0到9的字符都包括 | |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) | |
[a-z&&[^m-p]] |
| |
[a-z&&[^bc]] |
|
3、预定义字符类
. | 任何字符 ,而.本身用\. 表示 | |
\d | 数字 相当于 [0-9] | |
\D | 非数字 [^0-9] | |
\s | 空白字符:[ \t\n\x0B\f\r] | |
\S | 非空白字符:[^\s] | |
\w | 单词字符 [a-zA-Z_0-9] 在正则表达式里面组成单词的东西必须有这些组成 | |
\W |
|
4、边界匹配器
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 就是不是单词字符的地方。例:hello world 里面的空格 |
5、Greedy 数量词
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
应用
一.判断
a. 定义手机号码规则 :匹配130-139 150-159(除去154号段) 147 170 171 176-178 180-189号段
publicstaticvoid main(String[] args) {
/**
* 定义手机号码规则:匹配130-139 150-159(除去154号段)
* 147170 171 176-178 180-189号段
*/
//手机号码
String s1 ="17756783457";
String s2 ="15456783457";
//定义规则
String regex ="1(3[0-9]|47|5[0-3[5-9]]|7[0-1[6-8]]|8[0-9])\\d{8}";
boolean flag1 =s1.matches(regex);
boolean flag2 =s2.matches(regex);
System.out.println("flag1="+flag1+ " " +"flag2="+flag2);
}
结果:flag1=true flag2=false
b. 定义邮箱规则: 账号+@+域名
账号为字母、数字、下划线组成 ,即:[a-zA-Z_0-9]+
域名 :域名主体+域名后缀 例如qq.com 域名主体由字母、数字、下划线组成 即 [a-zA-Z_0-9]+ ;域名后缀由 .+字母、数字或下划线 ,可能会出现多次(\\.[a-zA-Z_0-9]+)+
综上可得最终规则: ^[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]+)+$
public static void main(String[]args) {
/**
* 定义邮箱
*/
//邮箱
Stringemail1 = "tom_123@163.com.cn";
Stringemail2 = "jack_345@qq.com";
//定义规则
Stringregex = "^[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]+)+$";
booleanflag1 = email1.matches(regex);
booleanflag2 = email2.matches(regex);
System.out.println("flag1="+flag1+ " " + "flag2="+flag2);
}
结果:flag1=true flag2=true
二.分割
将下列字符串分割为得到 a b c
Strings="a.b.c";
Strings1 ="a\\b\\c";
Strings2 = "a b c";
publicstaticvoid main(String[] args) {
String s = "a.b.c";
String[] arr =s.split("\\.");
for (String string : arr) {
System.out.print(string);
}
System.out.print(" ");
String s1 = "a\\b\\c";
String[] arr1 =s1.split("\\\\");
for (String string : arr1) {
System.out.print(string);
}
System.out.print(" ");
String s2 = "a b c";
String[]arr2 = s2.split("+");
for (String string : arr2) {
System.out.print(string);
}
}
结果:abc abc abc
三、替换
把所有的数字去掉
Strings ="hello123345world9008";
publicstaticvoid main(String[] args) {
String s ="hello123345world9008";
s = s.replaceAll("\\d","");
System.out.println(s);
}
结果:helloworld
四、获取
获取两个字母组成的单词
Strings ="jin tian tian qihen hao, ke yi chu qu wan le";
publicstaticvoid main(String[] args) {
/**
* 获取功能
*/
// 获取功能
String s = "jin tian tian qihen hao, ke yi chu qu wan le";
// 定义规则
String regex ="\\b\\w{2}\\b";
//把规则编译成模式对象
Pattern p =Pattern.compile(regex);
//通过模式对象得到匹配对象
Matcher m = p.matcher(s);
//查找是否存在满足条件的子串
while (m.find()) {
String s1 = m.group();
System.out.println(s1);//qi ke yi qu le
}
}
结果:
qi
ke
yi
qu