一、正则表达式是什么
正则表达式判断str里面的内容是否全为数字
public class Test2 {
public static void main(String[] args) {
String str = "123";
if (str.matches("\\d+")){
int num = Integer.parseInt(str);
System.out.println(num * 2);
}
}
}
在JDK1.4以前如果要使用正则表达式需要引入其它的jar文件,但是从JDK1.4之后,正则已经默认被JDK所支持,并且提供有java.util.regex开发包,同时针对String类也进行了一些修改,使其可以有方法直接支持正则处理。
使用正则最大的特点是在于方便进行验证处理以及方便进行复杂字符串的修改处理。
二、正则标记(背)
从JDK1.4开始提供有一个java.util.regex的开发包,这个包里面提供有一个Pattern程序类,在这个类里面定义有所有支持的正则标记.
1、【 匹配数量:单个 】字符匹配
- 任意字符: 表示由任意字符组成;
- \ \ :匹配"\";
- \n :匹配换行;
- \t :匹配制表符;
2、【 匹配数量:单个 】字符集(可以从里面任选一个字符)
- [abc]: 表示可能是字母a、b、c中的任意一个;
- [^abc]: 表示不是字母a、b、c中的任意一个;
- [a-zA-Z]:表示由任意字母所组成,不区分大小写;
- [0-9]: 表示由一位数字所组成;
3、【数量:单个】简化的字符集
- .:"英文下的点"表示任意的字符;
- \d:等价于“[0-9]”范围;
- \D:等价于”[ ^0-9]“范围
- \s:匹配任意一位空格,可能是空格、换行、制表符;
- \S:匹配任意一位非空格部分,可能是空格、换行、制表符;
- \w:匹配字母、数字、下f划线,等价于”[a-zA-Z_0-9]“;
- \W:匹配f非字母、数字、下划线,等价于”[ ^a-zA-Z_0-9]“;
4、边界匹配:
- ^:匹配边界开始;
- $:匹配边界结束;(一般在Java中用不上)
5、数量表示,默认情况下只有添加上了数量单位才可以匹配多位字符;
- 表达式?:该正则可以出现0次或一次;
- 表达式*:改正则可以出现0次、1次或多次;
- 表达式+:该正则可以出现1次或多次;
- 表达式{n}:表达式的长度正好为n次;
- 表达式{n,}:表达式的长度位n次以上;
- 表达式{n,m}:表达式的长度在n~m次;
6、逻辑表达式:可以连接多个正则:
- 表达式X表达式Y:X表达式之后紧跟上Y表达式验证;
- 表达式X|表达式Y:有一个表达式满足即可;
- (表达式):为表达式设置一个整体描述,可以为整体描述设置数量单位;
三、String对正则的支持
在进行正则表达式大部分处理的情况下都会基于String类来完成。
四、java.util.regex包支持
虽然在大部分的情况下都可以利用String类实现正则的操作,但是也有一些情况下需要使用到java.util.regex开发包中提供的正则处理类,在这个包里面一共定义有两个类:Pattern(正则表达式编译类)、Matcher(正则表达式匹配类)。
1、Pattern类提供有正则表达式的编译处理支持:public static Pattern compile(String regex);
同时也提供有字符串的才分的操作:public String[] split (CharSequence input);
public class Test4 {
public static void main(String[] args) {
String str = "JKL()UI$()QR@#JKLSD()QW#EIO$RJKLOSDF";
String regex = "[^a-zA-Z]+";
Pattern pat = Pattern.compile(regex);//编译正则表达式
String result [] = pat.split(str);
for (int x =0;x<result.length;x++){
System.out.println(result[x]);
}
}
}
打印内容:
JKL
UI
QR
JKLSD
QW
EIO
RJKLOSDF
2、Matcher类:实现了正则匹配的处理类,这个类的对象实例化依靠Pattern类完成:
- Pattern类提供的方法:public Matcher matcher(CharSequence input);
当获取了Matcher类的对象之后就可以利用该类中的方法进行如下操作:
- 正则匹配:public boolean matches();
- 字符串替换:public String replaceAll(String replacement);
范例:字符串匹配
public class Test5 {
public static void main(String[] args) {
String str = "101";
String regex = "\\d+";
Pattern pat = Pattern.compile(regex);//编译正则表达式
Matcher matcher = pat.matcher(str);
System.out.println(matcher.matches());
}
}
打印:true
public class Test6 {//取出全部的数字
public static void main(String[] args) {
String str = "1k23k12312k4k12412k421je21e14543i543#@$@#%322i6n43643i6n4i()";
String regex = "\\D+";
Pattern pat = Pattern.compile(regex);//编译正则表达式
Matcher matcher = pat.matcher(str);
System.out.println(matcher.replaceAll(""));
}
}
如果是纯粹的是以拆分、替换、匹配三种操作为例,根本用不到java.util.regex开发包,只依靠String类就都可以实现了。但是Matcher类里面提供有一种分组的功能,而这种分组的功能是String不具备的。
public class Test7 {
public static void main(String[] args) {
//要求取出 #{内容} 标记内的所有内容
String str = "INSERT INTO dept(deptno,dname,loc)VALUES (#{deptno},#{dname},#{loc})";
String regex = "#\\{\\w+\\}";
Pattern pat = Pattern.compile(regex);//编译正则表达式
Matcher matcher = pat.matcher(str);
while (matcher.find()){//是否有匹配成功的内容
System.out.println(matcher.group(0).replaceAll("#\\{|\\}",""));// “#\{” 或 “\}” 被替换为空
}
}
}
java.util.regex开发包,如果不是进行一些更为复杂的正则处理是很难使用到的,而String类所提供的功能只适合于正则的基础操作,而正则的验证是基础操作中最重要的部分。