常用的例子
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
String s="0-670-82162-4";
Pattern p=Pattern.compile("[^\\d]");//建立一个规则
Matcher m=p.matcher(s);//用这个规则,对s建立对象
String str=m.replaceAll("");//用新的规则去替换s对象里面旧的东西
System.out.println(str);//输出新的规则定义下的东西
}//输出:0670821624
}
正则表达式的好处:
1、正则表达式用来描述规则的字符串
2、只要正确描述表达式就可以使得正则表达式的引擎去判断目标表达式是否符合规则
3、正则表达式是一套标准,可以适合于任何语言
4、在jdk中,正则表达式的引擎在java.util.regex
常见正则表达式
1、匹配中文:[\u4e00-\u9fa5]
比如:Pattern p=Pattern.compile("[\\u4e00-\\u9fa5]");//匹配中文
2、英文字母:[a-zA-Z]
比如:Pattern p=Pattern.compile("[a-zA-Z]");//匹配符号
3、数字:[0-9]**
比如:Pattern p=Pattern.compile("[0-9]");
注意:这里的 “[]
” 是要写在表达式上的,表示在这个范围内都可以匹配
简单匹配原则
1、特殊字符要转义——在java语言里是用两个反斜杠的(看上面匹配中文的例子)
2、非ascll需要用 “\u####” 来转义,比如“a和c”——>
"a\u548cc”
来表示3、用 “ . ” 来表示任意一个字符,比如
“a.c”
可以表示“a-c”,“auc”等等(只能出现三个字符) 也可以用“ * ”来匹配任意一个字符,这个字符是任意的,长度也是任意的,比如“ A\d*”
----->“A1”,“A007”,或者“A0009”,因为007,0009也是数字
这里对他们做一下区别:"
."可以放在匹配字符的前面或者后面,但是“
*”只能放在匹配字符的后面,不可以放在前面
4、用 “ \d ” 可以表示一个数字,如“ 00\d” 可以表示为“007”,“001”,“009”等 用“ \D
”可以匹配一个非数字字符5、用“ + ”来匹配至少一个字符,常常和其他字符一起用,如“ 1\d+”-------->“1636366”
6、用“ ?”可以匹配0个或者1个字符
7、用“ {n} ”表示匹配n个字符
8、用“ {n,m}” 表示匹配{n-m个字符} 11、用“ {n,}”表示匹配至少n个字符
高阶匹配原则
1、“ ^ ”和“ $ ”匹配开头结尾,如“^A\d{3}$”----------->“A333”
2、[……]可以匹配范围内的字符,比如 “[asd]1 ”可以表示为“ a1”,“s1”,“d1”(值得注意的是:这个只能匹配范围内的一个字符
,如上面“as1”是不允许的)
这个可以有其他的形式,比如([a-d]
)
还可以是多字符组合,如([a-f0-9]{6}
)表示由a-f,0-9组合而成的6个字符
3、[^…] 表示非范围内的可以匹配
4、用“ |”表示或者,比如“asd|dfg”--------->“asd”,“dfg”;(注意用的时候要用括号就要用括号)
分组匹配原则
“
()
”用来快速分组,提取,如提取年月日:(yyyy)\-\(MM)\-\(dd)----->“yyyy”,“MM”,“dd”
常见的使用正则表达式的类
1、String.matches和pattern.matches的区别
一般来说,使用String正则表达式来快速匹配的时间效率会比较低,这是因为原来式子需要转换为pattren类型
所以我们可以直接把正则表达式直接编译为pattern对象,这样可以实现一次编译多次匹配2、使用Matcher.group(n) 可以快速提取字串
直接匹配一个单词
Pattern p=Pattern.compile("[(Alice)(Bob)]");//匹配Alice或者BOb两个单词中的一个