正则表达式,是用于操作字符串的规则。
如果需要验证一个QQ号码,要求为长度在5~15位之间,不能包含非数字,不能以零开头。
使用常规方法:
public static void checkQQ() { String qq="2484490912546779808679757806"; int len=qq.length(); if(len>=5&&len<=15) { if(!qq.startsWith("0")) { char[] ch=qq.toCharArray(); boolean flag=true; for(int x=0;x<ch.length;x++) { if(!(ch[x]>=‘0‘&&ch[x]<=‘9‘)) flag=false; } if(flag) { System.out.println("QQ="+qq); }else System.out.println("QQ号码中不可以包含非数字"); }else System.out.println("QQ号码不可以以零开头"); }else System.out.println("长度太长"); }
如果使用正则表达式来进行验证:
public static void checkQQ_1() { String qq="0123456907945806"; String regex="[1-9][0-9]{4,14}"; boolean flag=qq.matches(regex); if(flag) System.out.println(qq+"符合条件,匹配成功"); else System.out.println(qq+"匹配失败"); }
由两段程序发现,使用正则表达式,可以是代码变得更加简单。
首先我们要了解一些常用的正则表达式的写法:
字符类:
[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] |
Greedy数量词:
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过 m 次 |
练习:匹配手机号。13xxx,15xxx,18xxx
class RegexDemo2 { public static void main(String[] args) { checkTel(); } public static void checkTel() { String tel="15275560g79"; String regex="1[358]\\d{9}"; boolean flag=tel.matches(regex); if(flag) System.out.println(tel+"手机号码匹配成功"); else System.out.println(tel+"匹配失败"); } }
class RegexDemo3 { public static void main(String[] args) { //按照.进行切割,但是.在正则表达式中表示任意字符,所以要进行转义\\. splitDemo("zhangsan.wangwu.lisi","\\."); splitDemo("c:\\abc\\a.txt","\\\\"); //按照叠词进行切割,可以将规则封装成一个组,用()来完成,组都是有编号的,从1开始进行编号 //如果想要使用已经捕获的组,可以通过\n(n为组的编号)的形式来获取 //((A)(B(C))),有四个组,看左括号数目来确定组数 splitDemo("erkktyuqqaxcft","(.)\\1+"); } public static void splitDemo(String str,String regex) { String[] arr=str.split(regex); for(String s:arr) { System.out.println(s); } } }
class RegexDemo4 { public static void main(String[] args) { //将字符串中的五个以上的数字替换成#号 replaceAllDemo("wer4657558844ty976767uiod45667","\\d{5,}","#"); //将字符串中的叠词替换成#号 replaceAllDemo("erkktyuqqaxcft","(.)\\1+","#"); //将重叠的字母替换成单个字母,zzzz--z,$1用来获取前面正则表达式中获取到的组 replaceAllDemo("erkktyuqqaxcft","(.)\\1+","$1"); //将字符串中的叠词替换成$号,$在正则表达式中为特殊符号,直接使用会出现异常,应该进行转义\\$ replaceAllDemo("erkktyuqqaxcft","(.)\\1+","\\$"); } public static void replaceAllDemo(String str,String regex,String newstr) { str=str.replaceAll(regex,newstr); System.out.println(str); } }
/* 正则表达式的获取功能。 操作步骤: 1.将正则表达式封装成对象 2.让正则对象和要操作的字符串相关联的 3.关联后。获取正则匹配引擎 4.通过引擎对符合规则的子串进行操作,比如取出 */ import java.util.regex.*; class RegexDemo5 { public static void main(String[] args) { getDemo(); } public static void getDemo() { String str="ming tian jiu yao fang jia le,da jia"; //str="0123456"; //String reg="[1-9]\\d{4,14}"; //String reg="[a-z]{3}";//没有单词边界,没区分单词和单词 //加入\b单词边界 String reg="\\b[a-z]{3}\\b"; //将规则封装成对象 Pattern p=Pattern.compile(reg); //让正则对象和要作用的字符串相关联 Matcher m=p.matcher(str);//返回值为此模式的新匹配器,即引擎 //其实String类中的matches方法就是使用Pattern和Matcher实现的 //System.out.println(m.matches()); while(m.find())//将规则作用在字符串上,并进行符合规则的子串查找 { System.out.println(m.group());//用于获取匹配后的结果 System.out.println(m.start()+"......."+m.end());//打印出来每个部分的角标,包含头不包含尾 } } } /* //分析以下结果: String str="ming tian jiu yao fang jia le,da jia"; String regex="\\b[a-z]{4}\\b"; Pattern p=Pattern.compile(regex); Matcher m=p.matcher(str); System.out.println(m.matches());//返回false,mathes会将整个字符串与模式匹配 //对于:\\b[a-z]{4}\\b 该规则限定长度为4的字符串,因此不匹配 while(m.find())//如果使用\\b[a-z]{4}\\b规则匹配 System.out.println(m.group());//理应结果是ming tian fang //但是只有tian,fang这是因为在调用m.mathes后,匹配失败,内部指针已指到t位置, //从该位置在开始匹配 */
/* 练习:将下面的字符串转为:我要学编程 */ public static void test_1() { String str="我我...我我...我要..要要..要要...学学学....学学...编编编...编程.程.程程...程...程"; //先将字符串中的...替换成空字符串 str=str.replaceAll("\\.+",""); //然后将多个重复的字符换成单一字符 str=str.replaceAll("(.)\\1+","$1"); System.out.println(str); }
/* 将192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30 将IP地址进行地址段顺序的排序 */ public static void test_2() { //先将IP地址的每一段都补两个零 String ip="192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30"; ip=ip.replaceAll("(\\d+)","00$1"); //取每一段的后三位 ip=ip.replaceAll("0*(\\d{3})","$1"); String[] arr=ip.split(" +"); TreeSet<String> ts=new TreeSet<String>(); for(String s:arr) { ts.add(s); } for(String s:ts) { System.out.println(s.replaceAll("0*(\\d+)","$1")); } }
public static void checkMail() { String mail="abc12@sina.com"; String reg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}"; System.out.println(mail.matches(reg)); }
import java.io.*; import java.util.regex.*; import java.net.*; class RegexTest2 { public static void main(String[] args) throws Exception { getMails_1(); } /* 获取指定文档中的邮件地址 使用获取功能Pattern Matcher */ public static void getMails()throws Exception { BufferedReader bufr=new BufferedReader(new FileReader("mail.txt")); String line=null; String mailreg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}"; Pattern p=Pattern.compile(mailreg); while((line=bufr.readLine())!=null) { Matcher m=p.matcher(line); while(m.find()) { System.out.println(m.group()); } } } public static void getMails_1()throws Exception { URL url=new URL("http://192.168.123.7:8080/myweb/mail.html"); URLConnection conn=url.openConnection(); BufferedReader bufIn=new BufferedReader(conn.getInputStream()); String line=null; String mailreg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}"; Pattern p=Pattern.compile(mailreg); while((line=bufIn.readLine())!=null) { Matcher m=p.matcher(line); while(m.find()) { System.out.println(m.group()); } } } }
原文:http://www.cnblogs.com/mandy920213/p/3522074.html