计算机微刊javaJava

Java正则表达式

2017-10-09  本文已影响71人  一个有故事的程序员

导语

所有的开发一定要有正则的支持。

主要内容

具体内容

问题引出

为了更好的说明正则的应用,下面要求编写一个程序:判断一个字符串是否由数字所组成。
实现原理:

范例:实现字符串的判断

public class TestDemo {
    public static void main(String args[]) {
        String str1 = "123";
        System.out.println(isNumber(str1));
        String str2 = "1a23";
        System.out.println(isNumber(str2));
    }
    public static boolean isNumber(String temp) {
        char data [] = temp.toCharArray();  // 将字符串变为字符数组,目的是循环取出
        for(int i = 0; i < data.length; i++) {
            if(data[i] > '9' || data[i] < '0') {
                return false;
            }
        }
        return true;
    }
}

输出结果

true
false

此时判断字符串是否由数字所组成,是一个很容易实现的功能,但是就这样一个简短的操作,却写出了八行代码,那么如果说现在是更加复杂的操作呢?

范例:更简单的做法

public class TestDemo {
    public static void main(String args[]) {
        String str1 = "123";
        System.out.println(str1.matches("\\d+"));
        String str2 = "1a23";
        System.out.println(str2.matches("\\d+"));
    }
}

输出结果

true
false

一个写了很多行的代码,最后只是写了一行简单的操作就实现了,而其中出现的"\d+"就是正则表达式。

正则是从JDK1.4的时候正式引入到java中的工具类,所有正则支持的类都定义在java.util.regex包里面。在JDK1.4之前,如果想要使用正则,则需要单独下载一个正则表达式的开发包后才可以使用。

在java.util.regex包里面主要定义了两个主要的类:

正则标记(背会)

所有的正则可以使用的标记都在java.util.regex.Pattem类里面定义。

范例:使用正则表达式

public class TestDemo {
    public static void main(String args[]) {
        String str = "a";
        System.out.println(str.matches("a"));  // true
        System.out.println(str.matches("b"));  // false
        System.out.println(str.matches("[abc]"));  // true
        System.out.println(str.matches("[xyz]"));  // false
        System.out.println(str.matches("[^abc]"));  // false
        System.out.println(str.matches("[^xyz]"));  // true
        System.out.println(str.matches("[a-z]"));  // true
        System.out.println(str.matches("[A-Z]"));  // false

        str = "123";
        System.out.println(str.matches("\\d"));  // false
        System.out.println(str.matches("\\d+"));  // true
    }
}

输出结果

true
false
true
false
false
true
true
false
false
true

String类对正则的支持(重点)

在JDK1.4之后,由于正则的引入,所以String类里面也相应的增加了新的操作方法支持:

范例:实现字符串的替换

public class TestDemo {
    public static void main(String args[]) {
        String str = "klslkasjfALFJfiwq029342()*$;klja#AD";
        String regex = "[^a-z]";  // 此处编写正则
        System.out.println(str.replaceAll(regex, ""));
    }
}

输出结果

klslkasjffiwqklja

范例:实现字符串的拆分

public class TestDemo {
    public static void main(String args[]) {
        String str = "kj8LK89ssL8798KLLKlkllk5555ww";
        String regex = "\\d+";  // [0-9]
        String result [] = str.split(regex);
        for(int i = 0; i < result.length; i++) {
            System.out.println(result[i]);
        }
    }
}

输出结果

kj
LK
ssL
KLLKlkllk
ww

所有正则之中最应该引起我们兴奋的事情是因为可以使用它进行验证。

范例:验证一个字符串是否是数值

public class TestDemo {
    public static void main(String args[]) {
        String str = "10.2";
        String regex = "\\d+(\\.\\d+)?";
        System.out.println(str.matches(regex));
    }
}

输出结果

true

范例:验证一个字符串是否是邮箱

public class TestDemo {
    public static void main(String args[]) {
        String str = "hello.nihao123_123@mldn.com.cn";
        String regex = "[a-zA-Z][a-zA-Z0-9_\\.]{0,28}[a-zA-Z0-9]@\\w+\\.(net|cn|com|com\\.cn|org|gov|edu)";
        System.out.println(str.matches(regex));
    }
}

输出结果

true

java.util.regex包支持

在大多数情况下使用正则的时候都会采用String类完成,但是正则最原始的开发包是java.util.regex,这个包里也提供有两个类。

范例:Pattem类

public class TestDemo {
    public static void main(String args[]) {
        String str = "a1b22c333d4444e55555";
        String regex = "\\d+";
        Pattern pattren = Pattern.compile(regex);  // 编译正则
        String result [] = pattern.split(str);  // 拆分字符串
        System.out.println(Arrays.toString(result));
    }
}

输出结果

[a,b,c,d,e]
public class TestDemo {
    public static void main(String args[]) {
        String str = "24123";
        String regex = "\\d+";
        Pattern pattren = Pattern.compile(regex);  // 编译正则
        Matcher mat = pattern.matcher(str);  // 进行正则匹配
        System.out.println(mat.matches());  // 匹配结果
    }
}

输出结果

true

因为String类本身就已经支持这样的操作了,所以对于String类而言由于所有接收的数据也都是字符串,所以很少会去利用Pattem与Matcher两个类进行操作了。

总结

更多内容戳这里(整理好的各种文集)

上一篇 下一篇

猜你喜欢

热点阅读