正则表达式规定用某种模式来解决字符串的匹配、替换、获取等问题,基本所有支持它的语言在语法上都大同小异,例如:Javascript用字面量表达为:\[abc]+\g,这里双斜杠内包含的内容正就是正则表达式。而Java是以双引号作为正则表达式的定界,注意单斜杆在Java中有转义的意思,在表达任意数字“\d”时,应采用"\\d"的形式;
1、正则表达式的语法
- 单词符号
\d:数字[0-9]
\D:非数字[^0-9]
\s:空格[\t\r\f\n]
\S:非空格[^\t\r\f\n]
\w:常规字符[0-9_a-zA-Z]
\W:非常规字符[^0-9_a-zA-Z]
.:单个除了\n之外的任意字符
[abc]:中括号中的任意一个匹配字符 - 量词符号
*:代表0个或多个字符;
?:代表0个或1个字符;
+:代表1个或多个字符;
a{n}:代表n个a字符;
a{n,}:代表大于等于n个a字符;
a{n,m}:代表大于等于n个小于等于m个a字符;
(*|?|+|a{n}|a{n,}|a{n,m})?:其他量词后面带?代表非贪婪匹配,默认采用贪婪匹配; - 逻辑符号
^:逻辑非;
|:逻辑或;
&&:逻辑与; - 边界符号
^:出现在模式开头,^abc代表以abc开头的字符串;
$:出现在模式末端,abc$代表以abc结尾的字符串; - 捕获组符号
():小括号用于对捕获到的字符串进行分组;eg:(a(b(cd)e)f)gh,注意:左括号原则,从左往右数组号;
2、常用表达式
正整数:^[0-9]*[1-9][0-9]*$
浮点数:^(-?\d+)(\.\d+)?$
手机号码:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$
中文:^[\u0391-\uffe5]$
URL:^((http|https)://)?([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
18位身份证号:^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$
邮箱:^([A-Za-z0-9_-])+@([A-Za-z0-9_-])+((\.[A-Za-z0-9_-]{2,3}){1,2})$
3、Pattern模式类和Matcher匹配类
JDK1.4版在Java.util.regex类包中提供了Pattern和Matcher两个类用于支持正则表达式的应用;
Pattern p=Pattern.compile(“模式字符串”); //编译模式;
Matcher m=p.matcher(“查询字符串”);//获取匹配对象
System.out.println(m.matches());//获取匹配结果
Matcher类的常用方法:
4、正则表达式的作用
1、 字符匹配(表单输入验证);
2、 字符替换(替换掉字符串中的敏感字符);
3、 资源截取(身份证上的生日、电话号码)
5、实例
package xw.zx.regex;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestRegex02 {
public static void main(String[] args) {
BufferedReader br=null;
// 采用BufferedReader装饰标准输入类System。in方便调用readLine方法; 从控制台中获取输入数据;
br=new BufferedReader(new InputStreamReader(System.in));
String val;
System.out.println("请输入您想进入的模式序号(1/2/3或exit退出系统):\n1、匹配模式;2、替换模式;3、获取子数据模式;");
System.out.println("----------------------------------------------------------");
try {
while((val=br.readLine())!=null) {
if(val.equals("1")) {
String regex;
System.out.println("请输入被匹配字符串:");
val=br.readLine();
System.out.println("请输入匹配模式字符串:");
regex=br.readLine();
//字符串匹配
if(val.matches(regex)) {
System.out.println("您输入的字符串:"+val+"与模式:"+regex+"匹配成功!");
}else {
System.out.println("您输入的字符串:"+val+"与模式:"+regex+"匹配失败!");
}
}else if(val.equals("2")) {
String regex;
System.out.println("请输入被替换的字符串:");
val=br.readLine();
System.out.println("请输入替换模式字符串:");
regex=br.readLine();
System.out.println("请输入替换的内容:");
String replacement=br.readLine();
System.out.println("根据您输入被替换字符串:"+val+" 模式:"+regex+" 替换内容:"+replacement+":");
//字符串替换
System.out.println("替换结果为:"+val.replaceAll(regex, replacement));
}else if(val.equals("3")) {
String regex;
System.out.println("请输入您想获取字符串的源字符串:");
val=br.readLine();
System.out.println("请输入模式字符串:");
regex=br.readLine();
System.out.println("根据您输入的源字符串:"+val+" \n模式:"+regex+":");
Matcher m=Pattern.compile(regex).matcher(val);//创建匹配对象
String result="";
//调用find方法会移动指针至end索引,reset方法可以重置指针到0索引;
//m.reset();
while(m.find()) {
//start和end分别用来获取捕获的数据在原数据的起始和结束索引;
result+="获得到的值为:"+m.group() +"\n起始位置"+m.start()+"结束位置:"+m.end()+";\n";
}
System.out.println("获取结果:\n"+result);
}else if(val.equals("exit")){
System.out.println("已成功退出系统");
break;
}else {
System.out.println("请输入正确的模式序号或者exit退出系统");
}
System.out.println("请输入您想进入的模式序号(1/2/3):\n1、匹配模式;2、替换模式;3、获取子数据模式;");
System.out.println("----------------------------------------------------------");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(br!=null)br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
控制台输入输出结果:
请输入您想进入的模式序号(1/2/3或exit退出系统):
1、匹配模式;2、替换模式;3、获取子数据模式;
----------------------------------------------------------
1
请输入被匹配字符串:
350725199103180533
请输入匹配模式字符串:
(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?
您输入的字符串:350725199103180533与模式:(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?匹配成功!
请输入您想进入的模式序号(1/2/3):
1、匹配模式;2、替换模式;3、获取子数据模式;
----------------------------------------------------------
2
请输入被替换的字符串:
abcde4456fghhjk456lm
请输入替换模式字符串:
\d+
请输入替换的内容:
*
根据您输入被替换字符串:abcde4456fghhjk456lm 模式:\d+ 替换内容:*:
替换结果为:abcde*fghhjk*lm
请输入您想进入的模式序号(1/2/3):
1、匹配模式;2、替换模式;3、获取子数据模式;
----------------------------------------------------------
3
请输入您想获取字符串的源字符串:
我有两个邮箱地址,分别为:389759345@qq.com和1074450334@qq.com
请输入模式字符串:
([A-Za-z0-9_-])+@([A-Za-z0-9_-])+((\.[A-Za-z0-9_-]{2,3}){1,2})
根据您输入的源字符串:我有两个邮箱地址,分别为:389759345@qq.com和1074450334@qq.com
模式:([A-Za-z0-9_-])+@([A-Za-z0-9_-])+((\.[A-Za-z0-9_-]{2,3}){1,2}):
获取结果:
获得到的值为:389759345@qq.com
起始位置13结束位置:29;
获得到的值为:1074450334@qq.com
起始位置30结束位置:47;
请输入您想进入的模式序号(1/2/3):
1、匹配模式;2、替换模式;3、获取子数据模式;
----------------------------------------------------------
exit
已成功退出系统