欢迎大家来到IT世界,在知识的湖畔探索吧!
前言
在上一篇文章中给大家介绍了String字符串及其各种常用API方法,接下来继续给大家讲解一些String字符串的高级玩法。
有时候我们操作一个字符串时,这个字符串的内容并不一定就是固定不变的。比如在用户注册时,我们要求用户在输入框中输入自己的手机号码。我们知道,每个人的手机号码都是不一样的,那我们该如何保证用户输入的是合法的手机号呢?这就需要我们在代码中对这个手机号进行验证审核,不能随便输入11位数字就行了。这时,就需要对用户传递过来的字符串参数进行校验。
作为一个程序员,你可能会想到通过一段代码程序来进行判断,但这种方法需要创建对应的判断规则,然后用一堆的代码进行实现,比如:
boolean isValidMobileNumber(String s) { // 是否是11位? if (s.length() != 11) { return false; } // 每一位都是0~9: for (int i=0; i<s.length(); i++) { char c = s.charAt(i); if (c < '0' || c > '9') { return false; } } return true; }
欢迎大家来到IT世界,在知识的湖畔探索吧!
但上面的代码只是做了非常粗略的判断,并未考虑首位数字不能为0等更详细的情况,而且以后随着发展,可能手机号不只有11位,或者会有其他的规则。那时候再修改代码吗?这就很麻烦!
实际上,在开发时,如果我们想实现该功能,比较普遍且靠谱的做法,是利用正则表达式来进行实现。那么什么是正则表达式?它有哪些特点?怎么用?接下来就请大家跟随我们一起来学习今天的内容吧。
全文大约【6000】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考……
一. 正则表达式
1. 简介
有很多小伙伴之前听说过正则表达式,觉得这是一个很牛逼、很神奇的知识点,所以隐隐地觉得正则表达式学起来也会比较难。实际上,正则表达式的学习并不难!它其实是一种非常实用且简单的字符串操作工具,主要是作为匹配字符串的模板,能够将某个字符模式与所搜索的字符串进行对比匹配,并且正则表达式只是一套标准规范,和具体的某种开发语言并没有关系。也就是说,正则表达式不是java、python等某个语言独有的,而是在各种语言中都通用的,只是在每种语言中可能会有个别细微的差别。
而在正式开始学习正则表达式之前,让我们先来了解一下正则表达式的概念:
正则表达式是由各种普通的字符(如a~z、A~Z、0~9),以及一些特殊字符(元字符)组成的文字模板,是一种用于模式匹配和替换的规范。通俗地说,我们可以把正则表达式理解成是一种可以对字符串进行各种特殊处理的工具,比如可以对字符串进行【查找、提取、分割、替换】等操作。
也即是说,正则表达式只是一个描述规则的字符串。所以,只需要编写出正确的规则,我们就可以让正则表达式去判断目标字符串是否符合规则。比如”Hello World”这样的字符串也是一个正则表达式,它可以匹配 “Hello World”这个字符串。一个【点号】也是一个正则表达式,它可以匹配任意一个字符,如”a” 、”A”、”1″等。
2. 基本语法
知道了正则表达式的基本概念之后,接下来我们还需要了解它的一些基本语法及其含义。以下是开发时常用的正则表达式基本语法,各种复杂的正则表达式其实都是由这些基本的语法规则组成的。大家要注意,正则表达式的匹配规则都是按照从左到右进行匹配的,并且通过不同的符号组合,可以实现对字符串的精确匹配、模糊匹配,也可以匹配字母、数字、各种符号等。
有的小伙伴会说,上面这么多的规则,我记不住啊!
其实大家不用担心,我们没必要把以上这些规则都记住,只需记住几个常用的语法规则,以后开发时如果需要编写正则表达式,随时查阅API就可以了。
而且现在网上也有很多第三方的正则表达式编写网站,很多常用的表达式都已经写好了,我们只需要将这些规则直接拿来用即可。但是我们需要知道基本的规则,这样当有特殊需要时才能灵活修改组合,满足我们的特殊需求。
当然,我们在开发时编写的正则表达式,并不会像上表中展示的那样简单,可能是很复杂。但不管如何,这些复杂的表达式,都是由这些基本的语法规则组成的,我们了解这些基本规则即可。
3. 常用API
3.1 String中的正则表达式操作方法
为了让我们方便操作正则表达式,String类给我们提供了如下几个API方法,可以让我们结合正则表达式对字符串进行各种操作:
● boolean matches(String regex):判断该字符串是否匹配了指定的正则表达式;
● String replaceAll(String regex, String replacement):将该字符串中所有匹配了regex规则的子串都替换成replacement;
● String replaceFirst(String regex, String replacement):将该字符串中第一个匹配regex规则的子串替换成replacement;
● String[] split(String regex):以regex作为分隔符,把该字符串分割成多个子串。
以上API方法的使用格式如下所示:
欢迎大家来到IT世界,在知识的湖畔探索吧!//正则表达式 String reg = "a*c"; //对某个字符串进行匹配判断 boolean result="abc".matches(reg); //利用正则表达式对字符串进行替换,把用不规范的连续空格分隔的句子变成规范的句子 String s = "The fast\t\t snow down on the land cat."; String r = s.replaceAll("\\s+", " ");
3.2 正则表达式相关的操作类
上面这些方法都是Java提供的用于操作正则表达式的API方法,另外在java.util.regex包中也提供了以下三个可以操作正则表达式的类:
● Pattern类:Pattern对象是正则表达式编译后在内存中的表示形式,因此正则表达式字符串必须先被编译为 Pattern对象,然后再利用该 Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象。Pattern类没有公共的构造方法。如果我们想要创建Pattern对象,可以调用其公共的静态方法compile(),它会返回一个Pattern对象,且该方法要接受一个正则表达式作为它的第一个参数。
● Matcher类:Matcher类是对输入的字符串进行解释和匹配操作的引擎,该类也没有公共的构造方法,我们可以通过Pattern对象的matcher()方法来获得一个Matcher对象。
● PatternSyntaxException类:PatternSyntaxException是一个非强制的异常类,它可以表示在正则表达式中出现的语法异常。
以上API类的使用格式如下所示:
//将一个正则表达式字符串编译成Pattern对象 Pattern p = Pattern.compile("某个正则表达式,如a*b"); //使用Pattern对象创建Matcher对象,匹配某个字符串 Matcher m = p.matcher("abbbb"); //返回匹配结果,此处会返回true boolean b = m.matches();
二. 基本使用
了解了以上这些基础内容之后,接下来我们再通过几个实际案例,来带大家综合运用一下上面的内容。
1. 验证电话号码
我们在访问网站或APP时,经常会需要我们通过手机号来注册个会员,这时就需要我们输入电话号码。这个电话号码包括手机号码或者固定电话两种情况,两者的格式有点不同。但不管怎么样,网站或APP都会验证用户输入的电话号码是否合法,否则就会给用户一些提示。接下来壹哥就给大家设计一个验证电话号码是否合法的案例,通过本案例来综合练习一下前面学习过的内容。
1.1 正则表达式
直接给大家贴出了如下正则表达式,该正则表达式就可以用于验证电话号码是否合法。
欢迎大家来到IT世界,在知识的湖畔探索吧!String regex = "0\\d{2,3}[-]?\\d{7,8}|0\\d{2,3}\\s?\\d{7,8}|18[0-9]\\d{8}|15[1234]\\d{8}";
接下来再给大家解释一下该表达式的含义。
1.1.1 匹配固定电话
● 首先电话号码包括固定电话和手机号码,其中固定电话由区号和号码组成,手机号目前是11位纯数字;
● 固话的区号部分,以 0 开头,后面是 2~3 位数,因此在匹配区号时可以使用0\d{2,3}这个正则表达式;
● 固话的号码部分由 7~8 位数字组成,因此可以使用\d{7,8}表达式来进行匹配;
● 又因为固定电话的组合方式可能是“区号-号码” 或 “区号号码”,因此匹配固定电话号码时,可以使用“0\d{2,3}[-]?\d{7,8}|0\d{2,3}\s?\d{7,8}”表达式。
1.1.2 匹配手机号码
● 手机号码是11位纯数字,一般以数字“1x”开头,但不同运营商的手机号开头并不相同。
● 考虑到手机号码的特殊性,本案例只给大家示范18xxxxxxxxx和15xxxxxxxxx号段的手机号,我们可以使用“18[0-9]\d{8}|15[1234]\d{8}”这个表达式进行匹配。
● 该正则表达式会验证以18或15开头的手机号码,且15开头的手机号码,第3位数字只能是1、2、3、4中的一个。
1.2 代码实现
分析完了电话号码的正则表达式,我们再看看如何在Java代码中进行实现。
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; / * @author 一一哥Sun */ public class Demo11 { public static void main(String[] args) { //定义一个用于匹配电话号码的正则表达式 String regex = "0\\d{2,3}[-]?\\d{7,8}|0\\d{2,3}\\s?\\d{7,8}|18[0-9]\\d{8}|15[1234]\\d{8}"; //定义一个结束循环的标志位 String flag = "Y"; do { System.out.print("请输入电话号码:"); // 接收用户在控制台输入的电话号码 Scanner scan = new Scanner(System.in); String phone = scan.next(); // 编译正则表达式 Pattern pattern = Pattern.compile(regex); // 创建给定输入模式的匹配器 Matcher matcher = pattern.matcher(phone); //进行字符串的匹配 boolean bool = matcher.matches(); if(bool) { // 如果验证通过 System.out.println("电话号码格式可用"); } else { System.out.println("电话号码不可用,请重新输入!"); } System.out.print("是否继续注册?(请输入 Y/N 或 y/n)"); flag=scan.next(); }while(flag.equalsIgnoreCase("Y")); System.out.println("注册结束!"); } }
在本案例中,我们使用 do…while 语句进行循环判断,接收用户在控制台输入的电话号码,接着通过Pattern类进行编译,创建给定输入模式的匹配器,调用 matches()方法返回匹配的结果。如果结果为true,则表示验证通过;如果为false,则表示验证失败。最后再通过输入Y或N来判断是否结束循环。
2. 验证身份证号
2.1 身份证规则简介
我们知道,目前国内的二代身份证一般都是18位的,但因为历史遗留原因,还有个别一代身份证号码可能是15位的。一般18位或15位的身份证号码格式如下:
● 十八位号码:xxxxxx yyyy MM dd 375 0
● 十五位号码:xxxxxx yy MM dd 75 0
其中,身份证包含地区、日期、特殊字符来组成,一般的组成规则如下:
● 地区是6位的纯数字:[1-9][0-9]{5};
● 年份的前两位目前只能是18、19、20:(18|19|20) ,表示18-20;
● 年份的后两位可以是0-9之间的数字: [0-9]{2} 即00-99;
● 月份只有12个:((0[1-9])|(10|11|12)) ,即01-12;
● 天数,最多到31:(([0-2][1-9])|10|20|30|31) ,即1-31,这里无法对二月份特殊处理;
● 18位身份证后三位的顺序码:[0-9]{3},即000-999;
● 15位身份证后两位的顺序码:[0-9]{2},即00-99;
● 最后的校验码:15位身份证号的是[0-9] ,18位身份证号的则是([0-9]|(X|x)),只有18位的才会出现Xx。
2.2 正则表达式
根据上面的规则分析,我们就可以设计出身份证号码对应的正则表达式。
//18位号码 String id_18="^[1-9][0-9]{5}(18|19|20)[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}([0-9]|(X|x))"; //15位号码 String id_15="^[1-9][0-9]{5}[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{2}[0-9]";
2.3 代码实现
接下来我们就在Java代码中,对身份证号进行验证,看看是否合法。
public class Demo13 { public static void main(String[] args) { //18位号码的正则表达式 String reg18 = "^[1-9][0-9]{5}(18|19|20)[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}([0-9]|(X|x))"; //15位号码的正则表达式 String reg15 = "^[1-9][0-9]{5}[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{2}[0-9]"; //编译正则表达式 String validStr = "(" + reg18 + ")" + "|" + "(" + reg15 + ")"; Pattern pattern = Pattern.compile(validStr); //匹配身份证号是否合法,请在这里传入自己18/15位的身份证号 Matcher matcher = pattern.matcher(""); System.out.println("身份证号是否合法:"+matcher.matches()); } }
三. 结语
至此,我们就把正则表达式给大家简单地介绍完了,现在总结一下今天的重点:
● 掌握正则表达式的基本语法规则;
● 掌握Java代码中使用正则表达式;
● 了解几个常用的正则表达式匹配规则,比如手机号、身份证号等的验证;
更多精彩内容,关注@千锋教育
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/81976.html