YCOE

You Can't stOp mE!

导航

Java正则表达式

Posted on 2006-06-03 18:03  YCOE  阅读(1170)  评论(0编辑  收藏  举报
Java支持正则表达式,而且在JDK5.0版本又添加了对它的支持。
        有关正则表达式的教程,这里不再多说。只是简单说一下在编程过程中常遇到的一些问题的解决方案。

        首先是验证问题:
        验证问题很容易。可以有几种方法
1.直接用String对象提供的matches(String regx)方法。其中regx可以是一个正则表达式
       
            String reg0 = "^\\d{6}";
            String test0 
= "123456";
            System.out.println(test0.matches(reg0));

2.应用java.util.regex.Pattern和java.util.regex.Matcher对象

            String reg0 = "^\\d{6}";
            String test0 
= "123456";
            Pattern pattern0 
= Pattern.compile(reg0);
            Matcher matcher0 
= pattern0.matcher(test0);
            System.out.println(matcher0.find());

  上面两种方法得出的结果当然是一样的了。方法二看似很麻烦,但它却有更强大的功能。就是下面要说的获取

        获取问题也有几种方法,至少我知道就有两种。也和上面差不多。
1.应用String提供的replace(String regx)或replaceAll(String regx)方法。两者的区别一看就知道了。下面给个例子

        String reg0 = "\\d(abc)\\d";
        
//reg0匹配:一个数字+abc+一个数字
        String test0 = "sd4abc56gs";
        System.out.println(test0.replaceAll(reg0,
"A"));
        
//打印出:sdA6gs   
        
//也即是匹配reg0的字段"4abc5"被代换成了"A"
        System.out.println(test0.replaceAll(reg0,"$1"));
        
//打印出:sdabc6gs  
        
//也即是匹配reg0的字段"4abc5"被代换成了"$1"也就是正则表达式中匹配括号内的内容

  但是,如果要取得匹配组$1的内容,这样匹配后再代换的效率非常低。Java也提供另一种高效的方法。也就是
2.应用java.util.regex.Pattern和java.util.regex.Matcher对象

        String reg0 = "^\\d(abc)(\\d)";
        
//reg0匹配:一个数字+abc+一个数字
        String test0 = "4abc56gs";
        Pattern pattern0 
= Pattern.compile(reg0);
        Matcher matcher0 
= pattern0.matcher(test0);
        
if(matcher0.find()) {
            System.out.println(matcher0.group(
1));
        }

        
//打印出:abc 

  下面是些常用的正则表达式:

身份证号码:  这是我自己写的包含了15位和18位,还有x|y的情况,但无法对数据的合理性进行检查,比如:111111111111111111

\d{15}(\b|(\d{3}|\d{2}(x|y|X|Y))\b)

日期:这是网上一位牛人写的。一个字--强!(2000-2-29过不了)
^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$

时间:这是我自己写的24小时制,包含了35小时这种错误的检查
(20|21|22|23|[0-1]?\d):[0-5]?\\d:[0-5]?\d$

Email:不知道哪里来的了。反正不是很严密
^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* (这个是刚从网上找的,还没有验证过正确性)

手机号码:自己写的,包含以0开头或没有。以13形状的,好像最近开通了新的号码段
\b0?13\d{9}\b

URL地址:刚从网上找的,未验证
http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

IP地址:刚从网上找的,未验证
^(\d+)\.(\d+)\.(\d+)\.(\d+)$

                    --原创文章,可以随意复制发表,但请注明出处与作者
                                   BY YCOE