===案例介绍=======在说正则表达式之前,我们不妨从一个场景开始逐步介绍。你可能有过这样的经历:我们去一些网站注册一个账号。当您设置密码时,网站会提示您密码的长度范围以及相应的规则和限制(如下图)。根据上图,我们可以将密码设置规则描述为两种情况:(1)长度为6-16位;(2)密码必须包含数字、大写字母、小写字母、特殊字符(指定字符);现在假设我们不知道正则表达式。作为程序员,你是如何实现这样的密码验证的呢?下面是我写的验证方法(示例):/***验证用户密码是否符合设置规则**@parampassword用户输入的密码*@returntrue-satisfied;false-notsatisfied*/publicstaticbooleancheckPassword(Stringpassword){//密码不能为空if(password==null||password.isEmpty()){returnfalse;}//检查密码长度(6-16位)intlen=password.length();如果(len<6||len>16){返回假;}//定义四个组合条件booleanhasNumber=false;布尔hasSmallLetter=false;布尔hasBigLetter=false;布尔hasSpecialChar=false;将字符串拆分为单个字符,然后检查每个字符char[]chars=password.toCharArray();for(charc:chars){//是否包含数字0-9if(c>='0'&&c<='9'){hasNumber=true;继续;}//是否包含小写字母a-zif(c>='a'&&c<='z'){hasSmallLetter=true;继续努;}//是否包含大写字母A-Zif(c>='A'&&c<='Z'){hasBigLetter=true;继续;}//是否满足指定的特殊字符if("~@#S%*_-+=:.?".indexOf(c)>0){hasSpecialChar=true;继续;}//如果一个字符不在以上四种情况,则不满足规则returnfalse;}//如果四种情况组合条件都满足,则符合密码设置规则returnhasNumber&&hasSmallLetter&&hasBigLetter&&hasSpecialChar;}这个方法写对了吗?我们可能会使用几组密码进行验证:可以看到我们列出的8组密码都已经验证过了,说明我们的方法是可以的,但是这样的密码设置规则验证,我们会写差不多30行吗代码感觉有点繁琐?明明规则很简单,代码量却写了这么多。有什么办法可以简化我们的代码吗?当然有!那么,这个时候,我们就可以让我们的主角正则表达式出来了。下面是基于正则表达式的验证方法,验证功能相同:/***通过正则表达式验证用户密码是否符合设置规则**@parampassword用户输入的密码*@returntrue-满足;false-不满意*/publicstaticbooleancheckPasswordByRegex(Stringpassword){returnPattern.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~@#S%*_\\-+=:.?])[A-Za-z0-9~@#S%*_\\-+=:.?]{8,20}$",password);}这样正确吗?因此,我们可以通过上面的示例数据继续调用该方法进行验证:从结果可以看出,也符合我们的预期。所以我们发现,在不使用正则表达式的时候,我们的代码量是将近30行,但是当使用正则表达式的时候,代码就被压缩到了一行,也就是说,我们的代码在使用正则表达式的时候是可以简化的。但同时,我们也知道正则表达式是有一定的学习成本的。如果您不了解正则表达式,那么您可能会对它感到困惑。如果出现问题,您将无法修改它。所以,学习正则表达式还是很有必要的,至少以后你的同事写出来之后,你脑子里就不会出现“这是写什么了?为什么我看不懂”的想法.正则表达式什么是正则表达式?通过上面的案例,大家可能会有所了解。是的,他用一行字符串来描述某些规则(下图中箭头所指的红框)。正则表达式的英文名称是RegularExpression,所以我们通常将这两个词的前几个字母连在一起来定义与正则表达式相关的变量名,如regexp(单数)或regexps(复数)。比如:再比如,在Java的String类中,有几个相关的替换方法,也是支持正则表达式的,它的参数名也是regex。结构组成正则表达式通常由一些普通字符和一些元字符组成。普通字符:当它本身就是一个字符时,没有其他意义,比如我们常用的大小写字母和数字。元字符:除了本身是一个字符外,还可以表达其他含义(下图是部分元字符的节选)。其实我们学习正则表达式的大部分都是基于元字符的学习。使用场景学习了正则表达式后,我们可以有哪些使用场景呢?(1)对字符串进行规则校验(例如前面案例介绍中,我们可以使用正则表达式来校验一个密码是否符合规则)。(2)做字符串替换(比如去掉字符串中所有的大小写字母,或者用指定的符号替换)。(3)提取字符串中需要的字符(例如提取一个字符串中的所有数字组成一个新的字符串)。Java中的正则校验正则表达式的主要作用是校验字符串,所以在Java中,只需要使用下面的方法来校验即可。布尔结果=Pattern.matches(regex,input);其中:regex就是我们需要编写的正则表达式校验规则;input是要验证的字符串;返回的结果就是我们验证的结果,当为true时,表示验证通过,为false时,表示验证未通过。RegularMetacharacterRegularization:OrdinaryCharacters当我们的正则表达式是一串普通字符(不包括元字符)时,验证字符串只有和正则表达式一致才会通过验证。具体效果如下:注意:为了节省篇幅,不显得后面的例子繁琐,代码就不贴了,只贴验证结果。正则:\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个tab被4个空格代替,所以这里就不列出tab了)规律性:\S\S是\s的反义词,表示可见符号。例如:88\S99:表示88和99之间必须有一个可见的符号。正则:。.(小数点)表示除“\n”和“\r”之外的任何单个字符。如:....:表示任意四字正则:||(竖线)表示或的关系,表示检测到的字符串必须满足其中之一才满足条件。如:aa|bb|cc:表示输入的字符串必须是aa、bb、cc中的一种。注意,如果we或relationship前后有其他字符,需要用()包起来。例如: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][value1-value2]表示满足value1和value2之间的所有字符(包括value1和value2)。这种正则化常用于表示大小写字母的范围和数字的范围。例如:a[b-d]e:相当于a[bcd]e,因为b-d其实就是b、c、d这三个数。a[0-9]e:表示a和e之间有一个数,相当于a\de(我说\d表示一个数)正则:[^a-z][^value1-value2]表示除值1和值2之外的所有字符都满足。例如:a[^1-3]e:表示a和e之间的字符,只要不是1、2、3都满足。规律性:\num这里的num指的是number,即一个数。当\后跟数字时,表示匹配括号个数的结果。比如:现在有一个abcd字符串,当我们把c用括号括起来,然后在字符串后面写上\1,即ab(c)d\1,那么这里的\1就是指c,因为\1表示的是结果是第一个括号。ab(c)d\1:相当于abcdc。如果我们继续把ab(c)d\1中的d包含进去,在后面写上\2,即ab(c)(d)\1\2,那么这里的\2就代表字符d,因为结果第二个括号的是d,所以整个表达式等价于abcdcd。ab(c)(d)\1\2:等价于abcdcd,也等价于ab(cd)\1。常规的:??表示匹配前面的子表达式零次或一次。例如:abc?de:表示可匹配字符串为abde(匹配0c)或abcde(匹配1c)。正则模式:+匹配前一个子表达式一次或多次(次数>=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个。Regular:{n,m}m和n都是非负整数,n<=m。最少匹配n次,最多匹配m次。例如:abc{2,3}de:表示ab和de之间有2到3个c。常规:*表示匹配前面的子表达式任意次数。如:abc*de:表示ab和de之间有任意数(包括0)c。如果文章对您有帮助,请给领导免费点个赞,谢谢。
