正则表达式其实是由一些特殊的符号组成的,它代表的是某种规则。
正则表达式的作用1:用来校验字符串数据是否合法
正则表达式的作用2:可以从一段文本中查找满足要求的内容
5.1 正则表达式初体验
现在,我们就以QQ号码为例,来体验一下正则表达式的用法。注意:现在仅仅只是体验而已,我们还没有讲正则表达式的具体写法。
-
不使用正则表达式,校验QQ号码代码是这样的
public static boolean checkQQ(String qq){ // 1、判断qq号码是否为null if(qq == null || qq.startsWith("0") || qq.length() < 6 || qq.length() > 20){ return false; } // 2、qq至少是不是null,不是以0开头的,满足6-20之间的长度。 // 判断qq号码中是否都是数字。 // qq = 2514ghd234 for (int i = 0; i < qq.length(); i++) { // 根据索引提取当前位置处的字符。 char ch = qq.charAt(i); // 判断ch记住的字符,如果不是数字,qq号码不合法。 if(ch < '0' || ch > '9'){ return false; } } // 3、说明qq号码肯定是合法 return true; }
-
用正则表达式代码是这样的
public static boolean checkQQ1(String qq){ return qq != null && qq.matches("[1-9]\\d{5,19}"); }
使用正则表达式,大大简化的了代码的写法。
5.2 正则表达式书写规则
前面我们已经体验到了正则表达式,可以简化校验数据的代码书写。这里需要用到一个方法叫matches(String regex)
。这个方法时属于String类的方法。
这个方法是用来匹配一个字符串是否匹配正则表达式的规则,参数需要调用者传递一个正则表达式。但是正则表达式不能乱写,是有特定的规则的。
下面我们就学习一下,正则表达式的规则。从哪里学呢?在API中有一个类叫做Pattern,我们可以到API文档中搜索,关于正则表达式的规则,这个类都告诉我们了。我这里把常用的已经给大家整理好了。
我们将这些规则,在代码中演示一下
/** * 目标:掌握正则表达式的书写规则 */ public class RegexTest2 { public static void main(String[] args) { // 1、字符类(只能匹配单个字符) System.out.println("a".matches("[abc]")); // [abc]只能匹配a、b、c System.out.println("d".matches("[^abc]")); // [^abc] 不能是abc // 2、预定义字符(只能匹配单个字符) . \d \D \s \S \w \W // \转义 System.out.println("\""); // \n \t System.out.println("3".matches("\\d")); // \d: 0-9 System.out.println("a".matches("\\d")); //false // 3、数量词: ? * + {n} {n, } {n, m} System.out.println("1".matches("[0-9]?")); // ? 代表0次或1次 System.out.println("123".matches("[0-9]*")); // * 代表0次或多次 } }
5.3 正则表达式应用案例
学习完正则表达式的规则之后,我们看几个实际案例。
-
正则表达式校验手机号码
/** * 目标:校验用户输入的电话、邮箱、时间是否合法。 */ public class RegexTest3 { public static void main(String[] args) { checkPhone(); } public static void checkPhone(){ while (true) { System.out.println("请您输入您的电话号码(手机|座机): "); Scanner sc = new Scanner(System.in); String phone = sc.nextLine(); // 1. 手机号码,以1开头,第二位是3-9中的任意一个数字,后面跟着9个数字。 // 2. 座机号码,以0开头,后面跟着2-7位数字,然后可能会有一个横杠(“-”),后面是4-19位数字。 if(phone.matches("(1[3-9]\\d{9})|(0\\d{2,7}-?[1-9]\\d{4,19})")){ System.out.println("您输入的号码格式正确~~~"); break; }else { System.out.println("您输入的号码格式不正确~~~"); } } } }
-
使用正则表达式校验邮箱是否正确
public class RegexTest3 { public static void main(String[] args) { checkEmail(); } public static void checkEmail(){ while (true) { System.out.println("请您输入您的邮箱: "); Scanner sc = new Scanner(System.in); String email = sc.nextLine(); // 1. \w{2,} 匹配一个包含至少两个字母数字字符的字符串,用来匹配电子邮件地址的用户名部分。 //2. @ 匹配一个 "@" 符号,用来分隔用户名和域名。 //3. \w{2,20} 匹配一个包含至少两个字母数字字符、至多20个字母数字字符的字符串,用来匹配电子邮件地址的域名部分。 //4. (\\.\\w{2,10}){1,2} 匹配一个域名后面跟着的一个或两个点号(用 \\ 来转义点号),每个点号后面跟着一个至少两个、至多十个字母数字字符的字符串,用来匹配电子邮件地址的子域名和顶级域名。 if(email.matches("\\w{2,}@\\w{2,20}(\\.\\w{2,10}){1,2}")){ System.out.println("您输入的邮箱格式正确~~~"); break; }else { System.out.println("您输入的邮箱格式不正确~~~"); } } } }
总结一下,正则表达式优缺点都很明显。优点是很简练,缺点是可读性和可扩展性很差,以及很难写。
实际开发中,我们很少需要写正则表达式,当需要写正则表达式的时候,大部分程序员是通过在网上找对应的正则表达式来完成的,我们也可以这样做,即需要使用正则表达式的时候,上网搜一下就行