本篇主要介绍了一些常用的正则表达式
例子:判断手机号是否符合规则
public static void main(String[] args) {
String s = "13733121934";
if(s.matches("[1][358][0-9]{9}"))
System.out.println("zhengque");
String s1 = "in my heart, you are a pig";
String[] ss = s1.split(" ");
for(String c:ss)
System.out.println(c);
String s2 = "www.sohu.com";
String[] sss = s2.split("\\.");
for(String c:sss)
System.out.println(c);
String s3 = "sdfs sdfjs.sdf 222.30.230.7.sdfs wef";
String s4 = s3.replaceAll("[0-9]" ,"数字");
System.out.println(s4);
}
对字符串的操作1:
匹配——其实使用的就是String类中的matches方法。
切割——其实使用的就是String类中的split方法。
替换——其实使用的就是String类中的replaceAll()方法。
讲解正则表达式的地方略过
[http://blog.csdn.net/o0guang0o/article/details/45166689]
例子
public class Test {
// 匹配
public static void functionDemo_1() {
// 匹配手机号码是否正确。
String tel = "15800001111";
String regex = "1[358]\\d{9}";
boolean b = tel.matches(regex);
System.out.println(tel + ":" + b);
}
// 切割
public static void functionDemo_2() {
String str1 = "Java string split test";
String[] strarray = str1.split(" ");
for (int i = 0; i < strarray.length; i++)
System.out.println(strarray[i]);
String[] strarray1 = str1.split(" ", 2);// 使用limit,最多分割成2个字符串
for (int i = 0; i < strarray1.length; i++)
System.out.println(strarray1[i]);
String str2 = "192.168.0.1";
String[] strarray2 = str2.split("\\.");
// String[] strarray2=str2.split(".");这句不行,为什么?
for (int i = 0; i < strarray2.length; i++)
System.out.println(strarray2[i]);
String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
String[] names = str.split("(.)\\1+");
for (String name : names)
System.out.println(name);
}
// 替换
public static void functionDemo_3() {
String str1 = "asfas5fsaf5s4fs6af.sdaf.asf.wqre.qwr.fdsf.asf.asf.asf";
//将字符串中的.替换成_,因为.是特殊字符,所以要用\.表达,又因为\是特殊字符,所以要用\\.来表达.
str1 = str1.replaceAll("\\.", "_");
System.out.println(str1);
String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
String tel = "15800001111";// 158****1111;
tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println(tel);
}
public static void functionDemo_4() {
String str = "da jia hao,ming tian bu fang jia!";
String regex = "\\b[a-z]{3}\\b";
// 1,将正则封装成对象。
Pattern p = Pattern.compile(regex);
// 2, 通过正则对象获取匹配器对象。
Matcher m = p.matcher(str);
// 使用Matcher对象的方法对字符串进行操作。
// 既然要获取三个字母组成的单词
// 查找。 find();
System.out.println(str);
while (m.find()) {
System.out.println(m.group());// 获取匹配的子序列
System.out.println(m.start() + ":" + m.end());
}
}
public static void main(String[] args) {
functionDemo_2();
}
}
附:
1、常用正则表达式
匹配Email地址的正则表达式:
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:
[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:
\d{3}-\d{8} ?\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:
[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:
[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:
\d{15} ?\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:
\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
^[A-Za-z]+$
//匹配由26个英文字母组成的字符串
^[A-Z]+$
//匹配由26个英文字母的大写组成的字符串
^[a-z]+$
//匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$
//匹配由数字和26个英文字母组成的字符串
2、切割叠词
当你想要对一个规则的结果进行重用的时候,那么你可以把它封装成组,这个组中的结果就可以再新使用。组封装好之后,有一个自动的编号,从1开始。
而在引用各个组的结果时候,就使用\组号(也就是括号出现的位置)。
“jijoosfdsffklklklllewfwf”.split(“(.)\1”)。
切割与匹配的最大区别在于:匹配只要不满足,就返回false
而切割当不满足时候,继续向下进行匹配后切割。
比如说上例:
找到j 然后去看第二位是否是j,不是,则继续找第二位的i,看第三位是否是i,依次类推。直到oo 然后将字符串切割为jij sfdsffklklklllewfwf,然后继续寻找第二的字串中是否满足正则表达式中的定义。然后依次类推。
当想要使用oooooo这种形式去切割的时候,使用 “(.)\1+” 也就表示后边一个或多个字符和第一个字符相等的时候切割。