Java 从入门到进阶之路(十七)

2019-12-25

在之前的文章我们介绍了一下 Java 中类的内部类,本章我们来看一下 Java 中的正则表达式。

 在任何一种语言中,都绕不开正则表达式,而且大部分语言的正则表达式都有预定义的字符集,且预定义的字符集也都差不多,如下:

 

 上面的预定义字符集,在JavaScript,Java,Python 中其实是通用的,那接下来我们就利用 Java 的语法来对其进行一下解释。

1 public class HelloWorld {
2     public static void main(String[] args) {
3         String regex = ".";
4         String string1 = "A";
5         String string2 = "AB";
6         System.out.println(string1.matches(regex)); // true
7         System.out.println(string2.matches(regex)); // false
8     }
9 }

在上面的代码中,我们定义了一个 . 的正则表达,.  表示任意一个字符,不能多也不能少,如上,我们通过 matches 方法匹配一个 . 时,"A" 我 true,"B" 为 false;那我们就可以一次类推 \d \w \s 同样也是匹配一个字符,并且必须符合其中的规矩。

那我国我们想输出大于一位的该如何做呢,如下:

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         // + 表示至少出现一次,可以出现多次
 4         String regex1 = "[A-Z]+";
 5         String string1 = "A";
 6         String string2 = "AB";
 7         System.out.println(string1.matches(regex1)); // true
 8         System.out.println(string2.matches(regex1)); // true
 9 
10         /**
11          * {2,3}
12          * 逗号前面表示最少出现 2 次
13          * 逗号后面表示最多出现 3 次
14          *
15          * {2,} 表示最少出现 2 次,最多不限
16          * {0,2} 如果想表示最多出现次数,最少此时不限,则必须逗号前面为 0,不能为空
17          *
18          * */
19         //
20         String regex2 = "[A-Z]{2,3}";
21         String string3 = "A";
22         String string4 = "AB";
23         String string5 = "ABCD";
24         System.out.println(string3.matches(regex2)); // false
25         System.out.println(string4.matches(regex2)); // true
26         System.out.println(string5.matches(regex2)); // false
27 
28         // ? 表示至多出现一次
29         String regex3 = "[A-Z]?";
30         String string6 = "A";
31         String string7 = "AB";
32         System.out.println(string6.matches(regex3)); // true
33         System.out.println(string7.matches(regex3)); // false
34     }
35 }

在上面的代码中,我们实现了单一字符的次数问题,但是如果想要匹配的并非单一字符,比如 "ABC" 该如何实现呢,如下:

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         // () 内的将会被视为一个整体
 4         String regex1 = "(ABC)+";
 5         String string1 = "AB";
 6         String string2 = "ABC";
 7         System.out.println(string1.matches(regex1)); // false
 8         System.out.println(string2.matches(regex1)); // true
 9 
10         // | 表示 或 的意思
11         String regex2 = "(ABC|DEF)+";
12         String string3 = "ABC";
13         String string4 = "ABCDEF";
14         System.out.println(string3.matches(regex2)); // true
15         System.out.println(string4.matches(regex2)); // true
16 
17     }
18 }

在上面的代码中,我们发现,我们可以通过 () 将想要匹配的整体内容括起来,这样就解决了匹配非单一字符的问题,并且 | 表示或的意思,可以让我们更有选择性的匹配。

当然正则的匹配远不止上面所讲的这些,这只是写基础用法,当然我们根据这些基础用法其实就可以完成一些我们想要的正则匹配。

接下来我们根据上面所说的做一个简单的邮箱的正则匹配:

123abc@163.com,123456789@qq.com,abc_123@gmail.com.cn

上面的三个邮箱可能是我们常用的邮箱,他们在结构上都满足一些共同的特征:数字或字母下划线 @ 数字或字母下划线 . 数字或字母下划线 . 数字或字母下划线

那我们就可以根据上面的特征来做一个正则的验证:

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         /**
 4          * \w 或 [a-zA-Z0-9_] 都表示任意字母数字或下划线
 5          * (\.\w) 表示任意一个 .字符串
 6          * 注意:. 在正则中表示任意一个字符,所以前面需要加 \ 来将其转义
 7          *
 8          * */
 9         // \ 在 Java 中只是个普通的字符,所以在前面加一个 \ 将其转义,简单理解就是正则中如果出现 \ 就在前面再加一个 \
10         String regex = "[a-zA-Z0-9_]+@\\w+(\\.[a-zA-Z0-9_]+)+";
11         System.out.println(regex); // [a-zA-Z0-9_]+@\w+(\.[a-zA-Z0-9_]+)+
12         String mail = "abc123@163.com";
13         boolean flag = mail.matches(regex); // true
14         if (flag) {
15             System.out.println("是邮箱");
16         } else {
17             System.out.println("不是邮箱");
18         }
19     }
20 }

 

我们同样可以根据上面的内容来做一个手机号码的正则验证:

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         /**
 4          * 1[0,9]{10} 手机号码以 1 开头,后面为 10 为数字
 5          * (\+86|0086)?\s* 手机号前面可能会加 86 或 0086 以及 空格 这些
 6          * + 在正则表达式中有特殊含义,所以加 \ 转义
 7          * */
 8         String regex = "(\\+86|0086)?\\s*1[1-9]{10}";
 9         System.out.println(regex); // (\+86|0086)?\s*1[1-9]{10}
10         String phone = "+86 13666666666";
11         boolean flag = phone.matches(regex); // true
12         if (flag) {
13             System.out.println("是电话号码");
14         } else {
15             System.out.println("不是电话号码");
16         }
17     }
18 }