Java 正则表达式详解

一、正则表达式的引出

先完成一个简单的程序:判断一个字符串是否全部由数字组成。

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String str = " 13412a 4124214141232";
        if (isNumber(str)) {
            System.out.println("字符串由数字所组成!");
        } else {
            System.out.println("字符串不是全部由数字所组成!");
        }
    }

    public static boolean isNumber(String data) {
        char arr[] = data.toCharArray(); // 字符串变为字符数组
        for (int x = 0; x < arr.length; x++) {
            if (arr[x] < '0' || arr[x] > '9') {
                return false;
            }
        }
        return true;
    }
}

运行结果:

字符串不是全部由数字所组成!

这个验证不难,但是面对这样一个不麻烦的验证,代码写了9行代码,如果是一些更为复杂的验证呢?那么对于整体操作就更加的麻烦了,现在有另外一种做法:

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String str = "1341224124214141232";
        if (str.matches("\\d+")) {
            System.out.println("字符串是由数字所组成!");
        } else {
            System.out.println("字符串不是全部由数字所组成!");
        }
    }
}

运行结果:

字符串是由数字所组成!

很明显,现在对于程序而言,第二种方式更加的简单,而第二种方式就是使用了正则表达式的概念,而其中的“\d+”代码就属于正则表达式的程序代码。

正则表达式最早是在Linux下发展起来的,但是由于其使用方便,在JDK 1.4的时候将其正式引入到了Java的开发行列之中,而在JDK 1.4之前如果要想使用正则表达式,那么需要单独配置一个Apache的开发包,而JDK 1.4之后除了引入了正则的支持之外,同时也对String类进行了一些修改,可以让其直接操作正则。

在JDK 1.4之后专门引入了一个java.util.regex开发包,这个包中有两个主要类负责完成正则的开发:Pattern(定义并且编译正则的匹配模板)、Matcher(匹配应用),之所以现在不去关心这两个类,主要是因为JDK 1.4之后对String类的修改达到了一个很好的正则操作效果,主要使用String类完成。

二、常用正则标记

所有的正则标记都在java.util.regex.Pattern类中进行定义,下面分别对这些常用的符号做一些介绍。

1、字符:匹配单个字符
(1)字符x:表示匹配字符x;
(2)\\:匹配转义字符“\”;
(3)\t:匹配转义字符“\t”;
(4)\n:匹配转义字符“\n”。

实例:

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String str = "t";
        System.out.println(str.matches("t"));//匹配
        System.out.println(str.matches("T"));//不匹配
        System.out.println(str.matches("a"));//不匹配
    }
}

运行结果:

true
false
false

2、字符集(任意匹配里面的单个字符);

(1)[abc]:表示可能是字符a,可能是字符b或者是字符c中的任意一个;
(2)[^abc]:表示不是字母a、字母b、字母c的任意一个;
(3)[a-z]:表示全部小写字母中的任意一个;
(4)[a-zA-Z]:表示全部字母中的任意一个;
(5)[0-9]:表示全部数字的任意一个;

实例:

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String str1 = "a";
        System.out.println(str1.matches("[abc]"));//匹配
        System.out.println(str1.matches("[^abc]"));//不匹配
        System.out.println(str1.matches("[a-z]"));//匹配
        System.out.println(str1.matches("[a-zA-Z]"));//匹配

        String str2 = "1";
        System.out.println(str2.matches("[0-9]"));//匹配


    }
}

运行结果:

true
false
true
true
true

3、简写表达式(每一位出现的简写标记也只表示一位):

(1).:表示任意的一位字符;
(2)\d:表示任意的一位数字,等价于“[0-9]”
(3)\D:表示任意的一位非数字,等价于“[^0-9]”;
(4)\w:表示任意的一位字母、数字、_,等价于“[a-zA-Z0-9_]”;
(5)\W:表示任意的一位非字母、数字、_,等价于“[^a-zA-Z0-9_]”;
(6)\s:表示任意的一位空格,例如:\n\t等;
(7)\S:表示任意的一位非空格;

实例:

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String str1 = "a";
        System.out.println(str1.matches("."));//匹配
        System.out.println(str1.matches("\\w"));//匹配
        System.out.println(str1.matches("\\W"));//不匹配
        System.out.println(str1.matches("\\s"));//不匹配
        System.out.println(str1.matches("\\S"));//匹配

        String str2 = "1";
        System.out.println(str2.matches("\\d"));//匹配
        System.out.println(str2.matches("\\D"));//不匹配
        System.out.println(str2.matches("\\w"));//匹配
        System.out.println(str2.matches("\\W"));//不匹配


    }
}

运行结果:

true
true
false
false
true
true
false
true
false

4、数量表示(之前的所有正则都只是表示一位,如果要想表示多位,则就需要数量表示)
(1)正则表达式?:此正则出现0次或1次;
(2)正则表达式*:此正则出现0次、1次或多次;
(3)正则表达式+:此正则出现1次或多次;
(4)正则表达式{n}:此正则出现正好n次;
(5)正则表达式{n,}:此正则出现n次以上;
(6)正则表达式{n,m}:此正则出现n ~ m次。

实例:

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String str1 = "a";
        System.out.println(str1.matches("[a-z]?"));//匹配
        System.out.println(str1.matches("[a-z]+"));//匹配
        System.out.println(str1.matches("[a-z]{1}"));//匹配
        System.out.println(str1.matches("[a-z]{2}"));//不匹配

        String str2 = "abc";
        System.out.println(str2.matches("[a-z]*"));//匹配
        System.out.println(str2.matches("[a-z]+"));//匹配
        System.out.println(str2.matches("[a-z]{3}"));//匹配
        System.out.println(str2.matches("[a-z]{3,}"));//匹配

        String str3 = "abcde";
        System.out.println(str3.matches("[a-z]{5}"));//匹配
        System.out.println(str3.matches("[a-z]{5,}"));//匹配
        System.out.println(str3.matches("[a-z]{1,10}"));//匹配


    }
}

运行结果:

true
true
true
false
true
true
true
true
true
true
true

5、 逻辑表示(与、或、非)
(1)正则表达式A正则表达式B:表达式A之后紧跟着表达式B;
(2)正则表达式A|正则表达式B:表示表达式A或者是表达式B,二者任一满足即可;
(3)(正则表达式):将多个子表达式合成一个表示,作为一组出现。

三、String类对正则的支持

在JDK 1.4之后,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)

Pattern类之中存在的方法:
(1)字符串全拆分:public String[] split(CharSequence input)
(2)字符串部分拆分:public String[] split(CharSequence input, int limit);

Matterh类之中存在的方法:
(1)字符串匹配:public boolean matches()
(2)字符串全替换:public String replaceAll(String replacement)
(3)字符串替换首个:public String replaceFirst(String replacement)

实例1:字符串拆分(遇到字符拆)

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String str = "a1bb2ccc3dddd4eeeee5fffffff6ggggggg7";
        String regex = "[a-zA-Z]+";// 字母出现1次或多次
        System.out.println(str.replaceAll(regex, ""));
        System.out.println(str.replaceFirst(regex, ""));
    }
}

运行结果:

1234567
1bb2ccc3dddd4eeeee5fffffff6ggggggg7

实例2:字符串拆分(遇到数字拆)

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String str = "a1bb2ccc3dddd4eeeee5fffffff6ggggggg7";
        String regex = "\\d";// 数字出现1次,[0-9]
        String result[] = str.split(regex);
        for (int x = 0; x < result.length; x++) {
            System.out.print(result[x] + "、");
        }
    }
}

运行结果:

a、bb、ccc、dddd、eeeee、fffffff、ggggggg、

有了正则,对于字符串的种种操作就会变的相当方便。而正则在使用的过程之中最为重要的部分就是验证部分,因为一些字符串必须满足于指定的格式才可以操作。

实例3:做一个简单的验证,要求字符串格式“aaaaab”,在b之前至少1个a。

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String str = "aaaaaab";
        String regex = "a+b";
        System.out.println(str.matches(regex));
    }
}

运行结果:

true

范例4:验证字符串是否是小数,如果是则将其变为double型数据

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String str = "123.1";
        String regex = "\\d+(\\.\\d+)?";
        if (str.matches(regex)) { // 符合于验证要求
            double data = Double.parseDouble(str); // 字符串变为double型数据
            System.out.println(data);
        } else {
            System.out.println("字符串不是数字所组成!");
        }
    }
}

运行结果:

123.1

范例5:一个用户名只能由字母、数字、_所组成,其长度只能是6~15位。

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String str = "343234FDSF_";
        String regex = "\\w{6,15}";
        if (str.matches(regex)) { // 符合于验证要求
            System.out.println("用户名合法。");
        } else {
            System.out.println("用户名非法!");
        }
    }
}

运行结果:

用户名合法。
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值