一看就懂的正则表达式教程

目录
  • 案例引入
  • 正则表达式
    • 命名规范
    • 结构组成
    • 用途场景
    • Java中的正则校验
    • 正则元字符
      • 正则:普通字符
      • 正则:\d
      • 正则:\D
      • 正则:\w
      • 正则:\W
      • 正则:\s
      • 正则:[^abc]
      • 正则:[a-z]
      • 正则:[^a-z]
      • 正则:\num
      • 正则:?
      • 正则:+
      • 正则:{n}
      • 正则:{n,m}
      • 正则:*
  • 总结

案例引入

在讲正则表达式前,我们不妨先从一个场景来逐渐引入。

你可能有过这样的经历:我们去某些网站注册帐号,当你在设置密码的时候,网站会提示你密码的长度范围,以及对应的规则限制(如下图)。

根据上图,我们将密码设置规则可以描述为两个条件:

(1)长度为6-16位;

(2)密码中必须包含数字,大写字母,小写字母,特殊字符(指定字符);

现在假设我们不知道正则表达式,作为程序员的你,该如何去实现这样一个密码验证呢?

下面是我写的一个校验方法(样本):

/**
 * 校验用户密码是否满足设置规则
 *
 * @param password 用户输入的密码
 * @return true-满足;false-不满足
 */
public static boolean checkPassword(String password) {
    // 密码不能为空
    if (password == null || password.isEmpty()) {
        return false;
    }
    // 校验密码长度(6-16位)
    int len = password.length();
    if (len < 6 || len > 16) {
        return false;
    }
    // 定义四种组合条件
    boolean hasNumber = false;
    boolean hasSmallLetter = false;
    boolean hasBigLetter = false;
    boolean hasSpecialChar = false;
    // 将密码字符串拆分为单个字符,然后对每个字符进行校验
    char[] chars = password.toCharArray();
    for (char c : chars) {
        // 是否包含数字0-9
        if (c >= '0' && c <= '9') {
            hasNumber = true;
            continue;
        }
        // 是否包含小写字母a-z
        if (c >= 'a' && c <= 'z') {
            hasSmallLetter = true;
            continue;
        }
        // 是否包含大写字母A-Z
        if (c >= 'A' && c <= 'Z') {
            hasBigLetter = true;
            continue;
        }
        // 是否满足指定的特殊字符
        if ("~@#S%*_-+=:.?".indexOf(c) > 0) {
            hasSpecialChar = true;
            continue;
        }
        // 如果某个字符不在上面四种情况,则不满足规则
        return false;
    }
    // 如果四种组合条件均满足,则符合密码设置规则
    return hasNumber && hasSmallLetter && hasBigLetter && hasSpecialChar;
}

这个方法写得对不对呢?我们不防用几组密码去进行验证下:

可以看到,我们列举的8组密码,都得到了验证,说明我们的方法是OK的。

但这样一个密码设置规则校验,我们就差不多写近 30 行的代码,是不是感觉有点累赘了呢?明明规则很简单,代码量却写了这么多,有没有什么方法可以简化我们的代码呢?当然有!于是,这时就可以让我们今天的主角正则表达式出场了。

下面,则是具有相同校验功能,基于正则表达式的验证方法:

/**
 * 通过正则表达式校验用户密码是否满足设置规则
 *
 * @param password 用户输入的密码
 * @return true-满足;false-不满足
 */
public static boolean checkPasswordByRegex(String password) {
    return Pattern.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~@#S%*_\\-+=:.?])[A-Za-z0-9~@#S%*_\\-+=:.?]{8,20}$", password);
}

那么它写得到底对不对呢?于是,我们可以通过上面的示例数据,继续调用该方法来进行验证:

通过结果我们可以看到,他也是符合我们预期的。于是我们发现,在不用正则表达式的时候,我们的代码量近30行,而使用了正则表达式,代码就浓缩为了1行,也就是说,使用正则表达式时可以简化我们的代码。

但同时我们也可知,正则表达式具有一定的学习成本,如果你不懂正则表达式,那么你看它可能就是一头雾水,如果出了问题,更也就无从下手去修改它了。

所以,学会正则表达式还是有必要的,至少以后你的同事写出来后,不会在脑子里出现 "这是写的啥玩意儿啊?怎么我看不懂" 的想法。

正则表达式

什么是正则表达式?通过上面的案例大家可能多少有点了解了。是的,他就是通过一行字符串,来描述一定的规则(如下图箭头所指红框处)。

命名规范

正则表达式的英文为 Regular Expression,所以我们通常采用这两个单词的首几个字母合在一起,把正则表达式相关的变量名定义为 regexp(单数) 或 regexps(复数) 。

比如:

又比如,在 Java 的 String 类中,有几个相关替换的方法,它也是支持正则表达式的,他的参数命名也是 regex 。

结构组成

正则表达式通常由一些普通字符,以及一些元字符组成。

普通字符:就是本身作为一个字符时,它不具有其他含义,像我们常用的大小写字母和数字。

元字符:就是除了本身作为一个字符外,他还可以表达其他含义(下图是部分元字符节选)。

其实,我们学习正则表达式,大部分就是基于元字符的学习。

用途场景

学习了正则表达式,我们可以有哪些用途场景呢?

(1)做字符串的规则验证(比如前面的案例引入中,我们可以通过正则表达式来验证一个密码是否符合规则)。

(2)做字符串的替换(比如将一个字符串中所有的大小写字母去掉,或者替换为指定符号)。

(3)提取字符串中所需要的字符(比如一个字符串中所有的数字提取出来,组成一个新的字符串)。

Java中的正则校验

正则表达式主要用途就是校验字符串,那么在Java中,只需要通过下面这个方法即可进行校验。

boolean result = Pattern.matches(regex, input);

其中:

regex 是我们需要写的正则表达式校验规则;

input 是我们待校验的字符串;

返回的 result 就是我们校验的结果,当为 true 的时候,表示校验通过,当为 false 的时候,则表示校验不通过。

正则元字符

正则:普通字符

当我们的正则表达式为一串普通字符(不包含元字符)时,校验字符串只有和正则一致时,才会校验通过。

具体效果如下:

说明:后面例子为节省篇幅,不显得累赘,就不再贴代码,只贴校验结果。

正则:\d

\d 表示一个数字。

如:

aaa\d: 表示验证的字符串后面必须以 aaa 开头,且以一个数字结尾。

aaa\dbbb:aaa和bbb中间有一个数字

aaa\d\d:aaa后面跟2个数字

注意:在Java定义的正则里,由于一个\表示的是字符串转义,因此在Java定义带有\的元字符时,还需要多写一个\,即\\,至于其他语言,自己可查阅相关资料进行了解。

正则:\D

\D 表示一个非数字,它和上面 \d 的意思恰好相反。

如:

\D\D\D: 则表示一个长度为3,不包含数字的字符串。

111\D222:则表示111和222中间,必须包含一个非数字。

正则:\w

\w 表示一个字母(大小写均可)、数字,或下划线。

如:

12\w45:则表示12和45中间必须是一个字母,数字,或下划线。

正则:\W

\W 与 \w 相反,表示这个位置的字符既不是字母、数字,也不是下划线。

也就是:特殊符号(除下划线),或者空格等满足。

如:

12\w45:则表示12和45中间是一个非字母,非数字,或非下划线。

正则:\s

\s 表示匹配一个看不见的符号,即空格或制表符(Tab键)

如:

88\s99:则表示88和99中间须是一个空格或制表符。

(由于我的编辑器设置了1个制表符替换为4个空格,所以这里就不列举制表符情况了)

正则:\S

\S 与 \s 相反,表示一个可以看得见的符号。

如:

88\S99:则表示88和99中间须有一个看得见的符号。

正则:.

. (小数点) 则表示“\n”和"\r"之外的任何单个字符。

如:

.... :则表示任意四个字符

正则:|

| (竖线) 则表示或的关系,表示检测的字符串须满足其中一个时,才符合条件。

如:

aa|bb|cc:则表示输入的字符串须是aa,或bb,或cc其中的一个。

注意,如果我们或者关系的前后还有其它字符时,需要用()将他们包裹起来。

如:

xx(aa|bb|cc)yy:则表示输入的字符串须是xx开头,yy结尾,且中间是aa,或bb,或cc其中的一个。

正则:[abc]

[ ] 表示匹配其中任意一个字符。

如:

a[bcd]e:则表示a和e的中间须是b,或c,或d其中的一个

注意:用 | 表示其中之一,他可以是字符,也可以是字符串。而只用中括号时,则只表示其中一个字符。

正则:[^abc]

[^ ] 表示不与中括号里的任意字符匹配。

如:

a[^bcd]e:则表示a和e的中间除b,c,d这三个字符外,其他的字符都满足。

正则:[a-z]

[值1-值2] 则表示值1到值2中间的所有字符都满足(包括值1和值2)。常用该正则来表示大小写字母范围,数字范围。

如:

a[b-d]e:等同于 a[bcd]e,因为 b-d 其实就是b,c,d三个数。

a[0-9]e:则表示a和e中间是一个数字,等同于 a\de(前面说过\d表示一个数字)

正则:[^a-z]

[^值1-值2] 则表示除值1和值2之外的所有字符,都可以满足。

如:

a[^1-3]e:则表示a和e中间的字符,只要不是1,2,3,则都满足。

正则:\num

这里的num指number,也就是数字,当\后面跟数字,表示匹配第几个括号中的结果。

比如:现在有 abcd 字符串,当我们用小括号把 c 包裹起来后,然后在字符串后面写上 \1,即 ab(c)d\1,则这里的 \1 就指 c,因为 \1 表示第1个小括号中的结果。

ab(c)d\1:等同于 abcdc 。

如果我们继续把 ab(c)d\1 中的 d 包括起来,并在后面写上 \2,即 ab(c)(d)\1\2, 那么这里的 \2 就表示 d 这个字符,因为第2个小括号的结果是 d,所以整个表达式就等同于 abcdcd 。

ab(c)(d)\1\2:等同于 abcdcd,也等同于 ab(cd)\1 。

正则:?

? 表示匹配前面的子表达式零次或一次。

如:

abc?de: 表示可匹配的字符串为 abde (匹配0次c) 或 abcde (匹配1次c)。

正则:+

匹配前面的子表达式一次或多次 (次数 >= 1,即至少1次)

如:

abc+de:ab 和 de 之前至少有一个 c 。

正则:{n}

这里的 n 是一个非负整数。匹配确定的前面的子表达式 n 次。

如:

abc{3}de:表示 ab 和 de 之间有3个c。

ab(xx|yy){3}de:表示 ab 和 de 之间有 xx 或 yy 的个数, 一起合计为3个。

正则:{n,m}

m和n均为非负整数,其中 n<=m。最少匹配 n 次且最多匹配 m 次。

如:

abc{2,3}de:表示 ab 和 de 之间有 2 到 3 个 c。

正则:*

表示匹配前面的子表达式任意次。

如:

abc*de:表示 ab 和 de 之间有任意个数(包括0)c 。

总结

到此这篇关于正则表达式教程的文章就介绍到这了,更多相关一看就懂正则表达式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 正则表达式(括号)、[中括号]、{大括号}的区别小结

    正则表达式的() [] {}有不同的意思. () 是为了提取匹配的字符串.表达式中有几个()就有几个相应的匹配字符串. (\s*)表示连续空格的字符串. []是定义匹配的字符范围.比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字.[\s*]表示空格或者*号. {}一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格,\s[1,3]表示匹配一到三个空格. (0-9) 匹配 '0-9′ 本身. [0-9]* 匹配数字(注意后面有 *,可以为空)[0-9]+ 匹配数字(注意后

  • 正则表达式 \w \d 的意义

    对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云. 其实只是对正则不了解而以,了解了你就会发现,原来就这样啊正则所用的相关字符其实不多,也不难记,更不难懂,唯一难的就是组合起来之后,可读性比较差,而且不容易理解,本文旨在让大家对正则有一个基本的了解,能看得懂简单的正则表达式,写得出简单的正则表达式,用以满足日常开发中的需求即可. 什么是正则表达式 正则表达式是一种特殊的字符串模式,用于匹配一组字符串

  • 15/18位身份证号码验证的正则表达式总结(详细版)

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM dd 375 0     十八位 xxxxxx    yy MM dd   75 0     十五位 地区: [1-9]\d{5} 年的前两位: (18|19|([23]\d))            1800-2399 年的后两位: \d{2} 月份: ((0[1-9])|(10|11|12)) 天

  • 正则表达式匹配各种特殊字符

    写个可以匹配一下各种特殊字符的正则表达式 ((?=[\x21-\x7e]+)[^A-Za-z0-9]) x21-\x7e]+)[^A-Za-z0-9]) 这个匹配所有键盘上可见的非字母和数字的符号 var patrn = /[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%--&*()--\-+={}|<>?:""[].:'',..]/im; if (!patrn.test(str)) {// 如果

  • 正则表达式匹配任意字符(包括换行符)的写法

    今天在Java中想使用正则表达式来获取一段文本中的任意字符.于是很随意得就写出如下匹配规则: (.*) 结果运行之后才发现,无法获得换行之后的文本.于是查了一下手册,才发现正则表达式中,"."(点符号)匹配的是除了换行符"\n"以外的所有字符.同时,手册上还有一句话:要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式.于是我将正则表达式的匹配规则修改如下: ([.\n]*),当然,如果是在java程序中直接写到话,需要改为([.\\n]*) 结果

  • 最新手机号码、电话号码正则表达式

    今天开始小编为大家系统整理关于正则表达式的一系列文章,希望大家会喜欢. 首先了解一下正则表达式的概念,正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. java手机号码正则表达式: /** * 验证手机号码 * * 移动号码段:139.138.137.136.135.134.150.151.152.157.158.159.182.183.187.188.147 * 联通号码

  • 正则表达式基本语法详解

    正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符").模式描述在搜索文本时要匹配的一个或多个字符串. 1.正则表达式基本语法 两个特殊的符号'^'和'$'.他们的作用是分别指出一个字符串的开始和结束.例子如下: "^The":表示所有以"The"开始的字符串("There","The cat"等): "of despair$":表示所以以&q

  • 正则表达式匹配不包含某些字符串的技巧

    经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(hede)来过滤"hede"字串,但这种写法是错误的.我们可以这样写:[^hede],但这样的正则表达式完全是另外一个意思,它的意思是字符串里不能包含'h','e','d'三个但字符.那什么样的正则表达式能过滤出不包含完整"hello"字串的信息呢? 事实上,说正则表达式里不支持逆向匹配并不是百分之百的正确.就像这个问题,我们就可以使用否定式查找来模拟出逆向匹配,从而解决我们的问

  • JAVA正则表达式 Pattern和Matcher

    1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字

  • Java 正则表达式详解

    如果你不熟悉这个术语,那么"正则表达式"(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式. 正则表达式30分钟入门教程 常用正则表达式 许多语言,包括Perl.PHP.Python.JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级"搜索-替换"功能.那么Java又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Specification R

随机推荐