------- android培训、java培训、期待与您交流! ----------
java正则表达式
使用正则表达式可以方便的对数据进行匹配,还可以实现更加复杂的字符串验证,例如拆分,替换,获取,验证这些功能,假如,现在要求判断一个数字是否是全部由数字组成,可以有下面
两种做法
例1(不使用正则表达式)
import java.util.regex.*;
public class TestRegex {
public static void main(String[] args) {
String str = "2hjghgh";
boolean flag = true;
char[] c = str.toCharArray();
for(char mychar: c) {
if(mychar < '0' || mychar > '9') {
flag = false;
break;
}
}
if(flag) {
System.out.println("全部由数字组成");
} else {
System.out.println("不是全部由数字组成");
}
}
}
例2(使用正则表达式)
/*
* 使用正则表达式判断是否匹配数据
*/
import java.util.regex.*;
public class TestRegex2 {
public static void main(String[] args) {
String regex = "\\d+"; //指定匹配的规则
String testNum = "sadfsdf7687";
Pattern p = Pattern.compile(regex); //将给定的正则表达式编译到模式中
Matcher m = p.matcher(testNum); //得到匹配器
System.out.println(m.matches()); //尝试将整个区域与模式匹配。
System.out.println(p);
}
}
例二与例一的功能相同,但是例二的代码要比例一短好多,例二就是使用正则表达式进行验证的,具体的正则表达式是使用 Pattern 和 Matcher 这两个类完成操作的,正则表达式是1.5
增加的新内容
Pattern 类和 Matcher 类
这两个类在java.util.regex包中定义的, Pattern 主要进行正则规范的编写, Matcher 主要是执行规范,验证字符串是否符合规范
Pattern 类中常用的正则规范
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
Logical 运算符
XY X 后跟 Y
X|Y X 或 Y
(X) X,作为捕获组
例3(验证一个字符串是否是合法的日期时间格式)
import java.util.regex.*;
public class TestDateRegex {
public static void main(String[] args) {
String date = "1993-12-05 12:12:12";
String regex = "\\d{4}-[0-1]\\d-[0-3]\\d\\s[0-2][0-9]:[0-5][0-9]:[0-5][0-9]"; //指定匹配的规则
Pattern p = Pattern.compile(regex); //将给定的正则表达式编译到模式中
Matcher m = p.matcher(date);
if(m.matches()) {
System.out.println("日期格式合法");
} else {
System.out.println("日期格式不合法");
}
}
}
例4
/*
*
* 用正则表达式测试邮箱地址是否合法
* 并将邮箱地址中的小写字母全部替换成大写字母
*
*/
import java.util.regex.*;
public class TestEmailAddress {
public static void main(String[] args) {
String regex = "[\\d\\w]+@\\w+(\\.\\w+)+";
String test = "11asdasda@qq.com.cn";
System.out.println(TestEmailAddress.testEA(test, regex)); //显示是否为正确的地址格式
System.out.println(TestEmailAddress.replaceUpperChar(test)); //打印替换后的字符串
}
public static boolean testEA(String ea, String regex) { //该方法用来测试邮箱地址是否合法
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(ea);
return (m.matches()); //返回是否匹配
}
public static String replaceUpperChar(String ea) { //将指定邮箱地址中的小写字母全部变为大写
String regex = "[a-z]+";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(ea);
StringBuilder sb = new StringBuilder(ea); //用StringBuilder比String效率高
//String str = ea;
while(m.find()) {
sb = sb.replace(m.start(), m.end(), m.group().toUpperCase()); //找到一次替换一次
/* System.out.println(str = str.replace(m.group(), m.group().toUpperCase()));
System.out.println(m.start());
System.out.println(m.end());*/
//System.out.println(sb);
}
String s = new String(sb);
return s; //返回替换后的字符串
}
}
String 对正则表达式的支持
在 String 类中有三个主要方法支持正则表达式操作
1.public boolean matches(String regex) //字符串匹配
2.public String replaceAll(String regex, String replacement) //替换符合匹配的全部字符串
3.public String replaceFirst(String regex, String replacement) //替换符合匹配的第一个字符串
4.public String[] split(String regex) //根据正则表达式拆分字符串
5.public String[] split(String regex, int limit) //根据匹配给定的正则表达式来拆分此字符串。
例5
/*
* 叠词的去除,利用String中的方法替换拆分字符串
*
*/
public class TestStringTegex {
public static void main(String[] args) {
String str1 = "您您您您您您您您您您您您.......好好好好好好好好好好好好好好好........吗吗吗吗吗吗吗吗吗吗吗吗吗吗吗吗吗吗吗吗......!!!!!!!!!!!!!";
System.out.println("字符串验证操作" + str1.matches("^(.)\\1+"));
String str2 = str1.replaceAll("(.)\\1+", "$1"); //替换叠词
System.out.println(str2);
String[] str3 = str2.split("\\."); //利用。切割字符串
for(String str: str3) {
System.out.println("切割后的子字符串:" + str); //循环打印切割后的子字符串
}
}
}