夏洛打老师了 發表於 2022-2-15 11:03:44

常用正则表达式之密码格式验证大全

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">前言</a></li><li><a href="#_label1">示例</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1种</a></li><ul class="third_class_ul"><li><a href="#_label3_1_0_0">只能由1种组成</a></li><li><a href="#_label3_1_0_1">至少包含1种</a></li></ul><li><a href="#_lab2_1_1">2种</a></li><ul class="third_class_ul"><li><a href="#_label3_1_1_2">只能由2种组成</a></li><li><a href="#_label3_1_1_3">至少包含2种</a></li><li><a href="#_label3_1_1_4">任意2种组成</a></li></ul><li><a href="#_lab2_1_2">3种</a></li><ul class="third_class_ul"><li><a href="#_label3_1_2_5">至少包含3种</a></li></ul></ul><li><a href="#_label2">详解</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_3">吐槽</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label3">正文</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">附简单的正则表达式例子</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">最后</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>前言</h2>
<p>这里有你想要的正则表达式。网上这方面的内容比较分散,本文将尽量写出验证各种密码格式的正则表达式,漏了的情况请留言提示我进行添加,如果对你有帮助,麻烦给我一个赞,谢谢。</p>
<p>话不多说,直接上答案。</p>
<p class="maodian"><a name="_label1"></a></p><h2>示例</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1种</h3>
<p class="maodian"><a name="_label3_1_0_0"></a></p><h4>只能由1种组成</h4>
<p><strong>只能由字母组成,1-9位</strong></p>
<blockquote><p>^{1,9}$</p></blockquote>
<p><strong>只能由数字组成,1-9位</strong></p>
<blockquote><p>^\d{1,9}$</p></blockquote>
<p><strong>只能由特殊字符组成,1-9位</strong></p>
<blockquote><p>^[^\da-zA-Z\s]{1,9}$</p></blockquote>
<p class="maodian"><a name="_label3_1_0_1"></a></p><h4>至少包含1种</h4>
<p><strong>至少包含字母,1-9位</strong></p>
<blockquote><p>^(?=.*).{1,9}$</p></blockquote>
<p><strong>至少包含数字,1-9位</strong></p>
<blockquote><p>^(?=.*\d).{1,9}$</p></blockquote>
<p><strong>至少包含特殊字符,1-9位</strong></p>
<blockquote><p>^(?=.*[^\da-zA-Z\s]).{1,9}$</p></blockquote>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2种</h3>
<p class="maodian"><a name="_label3_1_1_2"></a></p><h4>只能由2种组成</h4>
<p><strong>只能由字母、数字组成,1-9位</strong></p>
<blockquote><p>^(?=.*\d)(?=.*)[\da-zA-Z]{1,9}$</p></blockquote>
<p><strong>只能由字母、特殊字符组成,1-9位</strong></p>
<blockquote><p>^(?=.*)(?=.*[^\da-zA-Z\s])(|[^\da-zA-Z\s]){1,9}$</p></blockquote>
<p><strong>只能由数字、特殊字符组成,1-9位</strong></p>
<blockquote><p>^(?=.*\d)(?=.*[^\da-zA-Z\s])(\d|[^\da-zA-Z\s]){1,9}$</p></blockquote>
<p class="maodian"><a name="_label3_1_1_3"></a></p><h4>至少包含2种</h4>
<p><strong>至少包含字母、数字,1-9位</strong></p>
<blockquote><p>^(?=.*)(?=.*\d).{1,9}$</p></blockquote>
<p><strong>至少包含字母、特殊字符,1-9位</strong></p>
<blockquote><p>^(?=.*)(?=.*[^\da-zA-Z\s]).{1,9}$</p></blockquote>
<p><strong>至少包含数字、特殊字符,1-9位</strong></p>
<blockquote><p>^(?=.*\d)(?=.*[^\da-zA-Z\s]).{1,9}$</p></blockquote>
<p class="maodian"><a name="_label3_1_1_4"></a></p><h4>任意2种组成</h4>
<p><strong>由字母、数字、特殊字符,任意2种组成,1-9位</strong></p>
<blockquote><p>^(?!+$)(?!\d+$)(?![^\da-zA-Z\s]+$).{1,9}$</p></blockquote>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>3种</h3>
<p class="maodian"><a name="_label3_1_2_5"></a></p><h4>至少包含3种</h4>
<p><strong>至少包含字母、数字、特殊字符,1-9位</strong></p>
<blockquote><p>^(?=.*\d)(?=.*)(?=.*[^\da-zA-Z\s]).{1,9}$</p></blockquote>
<p><strong>至少包含字母、数字、特殊字符,1-9位,并且不能连续出现3个大小连续或相同的数字(如:456、654、888)</strong></p>
<blockquote><p>^(?=.*\d)(?!.*(\d)\1{2})(?!.*(012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210))(?=.*)(?=.*[^\da-zA-Z\s]).{1,9}$</p></blockquote>
<p class="maodian"><a name="_label2"></a></p><h2>详解</h2>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>吐槽</h3>
<p>这块内容一般放在前言里的,但对于正则表达式的内容,写在上面有些多余,因为正则表达式这东西用的时候很少,一部分人可能对怎么写不感兴趣,或者要用的时候比较急,只想复制粘贴后能正常运行,我朋友就属于前两者(医生:你说的这个朋友,是不是你自己呀.jpg)。</p>
<p>看到这儿的应该是没那么急的,那么下面我们就来聊聊&mdash;&mdash;写出满足密码验证条件的正则表达式,需要了解哪些关键语法?</p>
<p class="maodian"><a name="_label3"></a></p><h2>正文</h2>
<table><tbody><tr><th>字符</th><th>描述</th></tr><tr><td>^</td><td>匹配输入字符串的开始位置。</td></tr><tr><td>$</td><td>匹配输入字符串的结束位置。</td></tr><tr><td>*</td><td>匹配前面的子表达式零次或多次。例如,zo*能匹配&ldquo;z&rdquo;以及&ldquo;zoo&rdquo;。*等价于{0,}。</td></tr><tr><td>+</td><td>匹配前面的子表达式一次或多次。例如,&ldquo;zo+&rdquo;能匹配&ldquo;zo&rdquo;以及&ldquo;zoo&rdquo;,但不能匹配&ldquo;z&rdquo;。+等价于{1,}。</td></tr><tr><td>?</td><td>匹配前面的子表达式零次或一次。例如,&ldquo;do(es)?&rdquo;可以匹配&ldquo;does&rdquo;或&ldquo;does&rdquo;中的&ldquo;do&rdquo;。?等价于{0,1}。</td></tr><tr><td>{n,m}</td><td>最少匹配n次且最多匹配m次。例如,&ldquo;o{1,3}&rdquo;将匹配&ldquo;fooooood&rdquo;中的前三个o。&ldquo;o{0,1}&rdquo;等价于&ldquo;o?&rdquo;。</td></tr><tr><td>.</td><td>匹配除换行符之外的任何单个字符。</td></tr><tr><td></td><td>匹配任意小写字母。</td></tr><tr><td></td><td>匹配任意大写字母。</td></tr><tr><td></td><td>匹配任意字母,不区分大小写。</td></tr><tr><td>\d</td><td>匹配一个数字。等价于。</td></tr><tr><td>\s</td><td>匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。</td></tr><tr><td>(?=pattern)</td><td>正向肯定预查。例如,&ldquo;Windows(?=2000)&rdquo;能匹配&ldquo;Windows2000&rdquo;中的&ldquo;Windows&rdquo;,但不能匹配&ldquo;Windows3.1&rdquo;中的&ldquo;Windows&rdquo;。</td></tr><tr><td>(?!pattern)</td><td>正向否定预查。例如&ldquo;Windows(?!2000)&rdquo;能匹配&ldquo;Windows3.1&rdquo;中的&ldquo;Windows&rdquo;,但不能匹配&ldquo;Windows2000&rdquo;中的&ldquo;Windows&rdquo;。</td></tr><tr><td>x|y</td><td>匹配x或y。例如,&ldquo;z|food&rdquo;能匹配&ldquo;z&rdquo;或&ldquo;food&rdquo;。&ldquo;(z|f)ood&rdquo;则匹配&ldquo;zood&rdquo;或&ldquo;food&rdquo;。</td></tr><tr><td></td><td>字符集合。匹配所包含的任意一个字符。例如,&ldquo;&rdquo;可以匹配&ldquo;plain&rdquo;中的&ldquo;a&rdquo;。</td></tr><tr><td>[^xyz]</td><td>负值字符集合。匹配未包含的任意字符。例如,&ldquo;[^abc]&rdquo;可以匹配&ldquo;plain&rdquo;中的&ldquo;p&rdquo;。</td></tr></tbody></table>
<p>上面这些语法应该是大家最常见的、也是最基础的,但对写密码格式验证的正则表达式来说,不是最关键的。</p>
<p>关键是下面3套组合拳:</p>
<ul><li>(?=.*x)<p>必须有x。</p>
<p>例:必须有数字&mdash;&mdash;&nbsp;(?=.*\d)&nbsp;,以此类推。</p></li></ul>
<ul><li>(?!.*x)<p>不能有x。</p>
<p>例:不能有数字&mdash;&mdash;&nbsp;(?!.*\d)&nbsp;,以此类推。</p></li></ul>
<ul><li>(?!x+$)<p>不能全是某一种字符。</p>
<p>例:不能全是数字&mdash;&mdash;&nbsp;(?!\d+$)&nbsp;,以此类推。</p></li></ul>
<p>有了上面的公式,再去看前面的示例应该就比较好理解了。</p>
<p>这里有些人可能就有点疑惑了&mdash;&mdash;上面的表中不是写的<code>&nbsp;(?=pattern)&nbsp;</code>表示在特定字符前,匹配前面的字符吗?如:</p>
<p><code>Windows(?=2000)&nbsp;</code>能匹配&ldquo;Windows2000&rdquo;中的&ldquo;Windows&rdquo;,怎么跟后面提到的用法不一样。</p>
<p>这是因为&nbsp;<code>Windows(?=2000)&nbsp;</code>中的&ldquo;Windows&rdquo;不仅仅只表示要获取的字符,同时还是一个筛选条件&mdash;&mdash;当&ldquo;2000&rdquo;前面是&ldquo;Windows&rdquo;时,即:&nbsp;<code>Windows(?=Windows2000)&nbsp;</code>,根据这个思路将正则表达式改为&nbsp;<code>(?=Windows2000)Windows</code>&nbsp;同样也是能匹配&ldquo;Windows2000&rdquo;中的&ldquo;Windows&rdquo;的。所以,当我们不在意&ldquo;2000&rdquo;前面有没有&ldquo;Windows&rdquo;,甚至不在意前面有没有字符时,<code>&nbsp;(?=.*2000)&nbsp;</code>就代表必须有&ldquo;2000&rdquo;,才匹配字符串了。</p>
<p class="maodian"><a name="_label4"></a></p><h2>附简单的正则表达式例子</h2>
<div class="jb51code"><pre class="brush:java;">/**
* @ClassName: RexTest
* @Description: TODO
* @author BMR
* @date 2016年3月28日 上午11:09:17
*/
public class RexTest {
    /**
   * 正则表达式验证昵称
   * @param nickName
   * @return
   */
    public static boolean rexCheckNickName(String nickName) {
      // 昵称格式:限16个字符,支持中英文、数字、减号或下划线
      String regStr = "^[\\u4e00-\\u9fa5_a-zA-Z0-9-]{1,16}$";
      return nickName.matches(regStr);
    }

    /**
   * 正则表达式验证密码
   * @param input
   * @return
   */
    public static boolean rexCheckPassword(String input) {
      // 6-20 位,字母、数字、字符
      //String reg = "^(|||[`-=[];,./~!@#$%^*()_+}{:?]){6,20}$";
      String regStr = "^(|||[`~!@#$%^&amp;*()+=|{}':;',\\\\[\\\\].&lt;&gt;/?~!@#¥%……&amp;*()——+|{}【】‘;:”“'。,、?]){6,20}$";
      return input.matches(regStr);
    }
   
    public static void main(String[] args){
      System.out.println("rexCheckPassword is: "+ rexCheckPassword("14`~!@#$%^&amp;*(\\)+=|{}"));
      System.out.println("rexCheckNickName is: "+ rexCheckNickName("中英文-数字_减号或下划线"));
      System.out.println("rexCheckNickName is: "+ rexCheckNickName("12文、数字、@"));
    }</pre></div>
<p>输出结果:</p>
<blockquote><p>rexCheckPassword is: true<br />rexCheckNickName is: true<br />rexCheckNickName is: false</p></blockquote>
<p class="maodian"><a name="_label5"></a></p><h2>最后</h2>
<p>之所以写这个随笔,也是由于最近在找一个密码验证的正则表达式,找了好久都没有一个满意的。搜到的文章里有示例的不够全面,或者详解部分不够针对,不符合应用场景。在看了一些资料后,终于写出了需要的正则表达式,后来意识到可能大家也会遇到跟我类似的情况,所以就想挑战一下自己,算是完善自身,帮助他人,我想这也是大家写博客的初衷。</p>
頁: [1]
查看完整版本: 常用正则表达式之密码格式验证大全