java正则表达式(其实没你想的怎么难)

       问题

        最近工作中遇到一个问题,需要验证前端输入的格式是否是邮件格式,不会,怎么办,百度嘛,直接就到找到了答案

   /**
     * 验证Email
     *
     * @param email email地址,格式:zhangsan@sina.com,zhangsan@xxx.com.cn,xxx代表邮件服务商
     * @return 验证成功返回true,验证失败返回false
     */
    public static boolean checkEmail(String email) {
        String regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?";
        return Pattern.matches(regex, email);
    }

上面这段代码确实可以解决部分的邮件地址验证,但是因为对正则的语法不是很熟悉,也不想花时间去研究(看着就挺麻烦的),导致代码提交后测试就提出了问题。

当输入ly-ww@qq.com这种正常的邮件就验证不通过了,没办法只能又去万能的百度了

百度中。。。

终于找到一个上面的邮箱也能验证通过的代码

/**
     * 验证Email
     *
     * @param email email地址,格式:zhangsan_1_2@sina.com,zhangsan@xxx.com.cn,xxx代表邮件服务商
     * @return 验证成功返回true,验证失败返回false
     */
    public static boolean checkEmail(String email) {
        String regex = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$";
        return Pattern.matches(regex, email);
    }

        虽然问题解决了但是心里就堵着,因为只是解决了问题,并不知道为什么解决了问题。想着以后用正则表达式的情况还会有,花时间学一下,看这个正则是不是真的怎么难?

学习中。。。。

哈哈小有成就,我这个人呢有点得瑟有点东西就想让大家都知道,现在就给大家显摆显摆

我们就以前面两段代码为例,带你让揭开正则表达式这个神秘的面纱。

揭秘

        简单说一下正则表达式是什么,他其实就是一个通过正则符号正则语法组在一起的规则,它的一个作用就是判断你的内容是否符合这个规则,就比如上面验证邮件地址

这里提及到了两个东西一个是正则符号,一个是正则语法

可以先学习下基础

Java 正则表达式 | 菜鸟教程

看了上面的学习文档你对正则就有了基本的认识了,下面直接上干货,看看我上面的第一个正则和第二个正则到底有什么区别

String regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?";

为了理解这个表达式你需要先知道的东西(你没有看前面的学习文档)

\

将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如, n匹配字符 n。\n 匹配换行符。序列 \\\\ 匹配 \\ ,\\( 匹配 (。

+

一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。

?

零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。

\w

匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。

[xyz]

字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。

有了这些基础的知识我们再来一一解读上面的正则表达式

'\\w':也就是 \ 和 \w组合在一起,\表示转义,\w表示匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]",这里有的同学可能不理解为啥要加上转义符号‘\’,就简单理解吧,不加上这个'\'转义符号,java识别不了'\w'。

'\\w+':虽然上面已经贴了‘+’号的含义了,我这里还是解释下吧,就是至少有一个子类字符,“例如:a,A23a, A_1a”这些都是符合要求的。

'\\w+@': 就是任意一个或者多个字符加上@,例如a@,a_A@,Aaa221@等

'\\w+@+\\w+':前面已经解释了'\\w'的意思,在简单解释下就是 任意一个或者多个字符加上@再加上任意一个或者多个字符,例如:111@qqw,22qq@wed,333_44@q23等,现在看是不是有点邮箱的雏形了,我们接着往下看。

'\\w+@+\\w+\\.':'\\.'单独解释下,其实就是'.'符号的转义,因为'.'符号是正则符号(它匹配任何一个字符如:"a" 或 "1"),所以这里需要转义,让它就表示匹配'.'符号,所以这里就是在前面的基础上多加一个'.'符号。例如:111@qqw.     22qq@wed.    333_44@q23 

'\\w+@+\\w+\\.[a-z]+':'[a-z]+'表示任意一个或者多个小写字符,如aaa,bbb,sds。加上前面的规则得出现在符合要求的字符串例如:1wa1@qqw.com,11we11@qqw.com,1sw2_2@2w.com等

'\\w+@+\\w+\\.[a-z]+(\\.[a-z]+)?':'(\\.[a-z]+)?'解释这个首先需要对'?'理解到位,'?'表示括号里面的内容即例子中的'(\\.[a-z]+)'匹配0次或者一次【'\\.[a-z]+'表示匹配'.'符号加上任意一个或者多个小写字符,例如'.cn','.zhs'等】,这样说可能有的同学还是理解不了,直接上例子,'11we11@qqw.com','11we11@qqw.com.cn'这两个都是符合正则表达式的,这两个有什么区别呢,就是后面的多了个'.cn',多的部分'.cn'是符合'\\.[a-z]+'正则的,但是我也可以不输入后面的部分也是符合的这就是'?'这个符号的作用。

到这里对于第一个正则的解释也就完全了,我这里随便列几个看看你分辨的了吗

2wQ2@1_Qd1.com,w-sd@qq.com.cn,QQ@w.sss.cn.com,111www.cn,2qq@w.sss

你思考中。。。

下面公布答案

w-sd@qq.com.cn 不可以,因为前面有一个'-'符号

QQ@w.sss.cn.com 不可以,因为后面多了'.com'内容

111www.cn 不可以,因为这里少了'@'符号

到这里对第一个正则就分析完了,接下来我们分析第二个正则

 String regex = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$";

同样的需要基础知识准备

^

匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。

$

匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。

{n,m}

m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。

*

零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"zo"和"zoo"。* 等效于 {0,}。

所以这里的'^','$'标识正则的开始和结束可以直接不看,有的小伙伴可能有疑问前面的为啥不加上这两个符号,相当于规范把,你不加和加上是一个意思,你也可以在前面的正则的开始和结束加上这两个符号效果是一样的。

'[a-zA-Z0-9_.-]+':表示匹配26个大小写字母,0-9,'_','-','.'一个或者多个,这里就解释了前面为啥ly-ww@qq.com这个匹配不了,就是因为'-'前面的正则识别不了。

'[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+':现在看这个是不是也很好理解了,同样就是字符加@加字符,

例如:12wa_-@www-swq2,21@eee等

'[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*':'*'表示括号里面的内容出现多次或者零次

例如:21@eee(0次),21@eee.com(一次),21@eee.com.cn(多次)

'[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}':'\\.[a-zA-Z0-9]{2,6}'表示'.'符号加上2-6个大小写字母或者数字如(.cn)。所以加上前面的内容合起来的例如:21@eee.com,21@eee.com.cn,21@eee.cn等

好了到这里对第二个正则也解释好了,现在你会发现第二个其实可以进一步简化

'[\\w-]+@[\\w-]+\\.com\\.cn',这个匹配的后面只能是'.com.cn'加上前面的一个或者多个字符加上@1个或者多个字符,例如:443345@qq.com.cn,aliyun123@hy.com.cn等。

通过对这两个正则分析,管中窥豹,相信你一定有所收获,当然这些都是最基础的用法哦。

正则表达式没你想得怎么难,就像你追不上美女一样,你不去试试怎么知道行不行呢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值