16

任何人都可以帮助我使用正则表达式以允许至少一个特殊字符、一个大写字母、一个小写字母。

这是我到目前为止所拥有的:

 ^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$

但它似乎只按照“特殊字符”、“大写”、“小写”的顺序匹配字符。

任何帮助是极大的赞赏

4

5 回答 5

29

你的正则表达式

^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$

实际上应该可以正常工作,但是您可以通过删除第一个使其变得更好.*

^(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$

将匹配任何至少包含 8 个字符的字符串,该字符串包含至少一个小写字母和一个大写 ASCII 字符以及至少一个字符集中的字符@#$%^&+=(以任何顺序)。

于 2012-05-11T19:36:50.623 回答
7

这是您可以使用的功能。

function checkRegex(string) {
    var checkSpecial = /[*@!#%&()^~{}]+/.test(string),
        checkUpper = /[A-Z]+/.test(string),
        checkLower = /[a-z]+/.test(string),
        r = false;

        if (checkUpper && checkLower && checkSpecial) {
            r = true;
        }

        return r;

        }

然后检查它是真还是假。

var thisVal = document.getElementById('password').value;
var regex = checkRegex(thisVal);

如果var regextrue则条件满足。

于 2015-06-03T18:10:53.453 回答
4

可以通过3个正则表达式快速完成。

function check($string){
   return    preg_match("/[`!%$&^*()]+/", $string) 
          && preg_match("/[a-z]+/", $string) 
          && preg_match("/[A-Z]+/", $string) ;
}

不要忘记调整特殊字符列表。因为我不知道你觉得什么角色特别。

我相信在您不是专家的情况下在单行正则表达式上浪费大量时间不会提高您的生产力。这 3 个正则表达式解决方案就可以了。它可以节省时间。

于 2012-05-11T19:36:31.497 回答
2

如果您想要如下图所示的输出:

密码验证器

您可以使用下面的动态自定义组件:

import { Component, Input, OnInit, EventEmitter, Output, OnChanges } from '@angular/core';
import { RegExpValidator } from '../../classes/reg-exp-validator';

@Component({
  selector: 'app-reg-exp-validator',
  template: `
       <div *ngFor="let regExp of regExps" style='text-align: left'>
          <div>
            <i *ngIf="!regExp.isOptional" [ngStyle]="{'color': isValidExp(regExp) ? 'green' : 'red'}"
               [className]="isValidExp(regExp)? 'pi pi-check-circle' : 'pi pi-times-circle'">
              </i>
            <i *ngIf="regExp.isOptional" [ngStyle]="{'color': isValidExp(regExp) ? 'green' : 'orange'}"
               [className]="isValidExp(regExp)? 'pi pi-check-circle' : 'pi pi-times-circle'">
              </i>
            {{regExp.message}}
          </div>
       </div> `
})
export class RegExpValidatorComponent implements OnInit, OnChanges {



  @Input() value: string;
  @Input() regExps: Array<RegExpValidator>;

  @Output() onChange: EventEmitter<boolean> = new EventEmitter();

  constructor() { }

  ngOnChanges(): void {
    this.validateExpressions();
  }

  ngOnInit() {   
  }

  isValidExp(regExp) {
    if (regExp.isValid)
      return regExp.isValid;
  }

  initiValue() {
    this.value = this.value == undefined ? "" : this.value;
  }


  validateExpressions() {
    this.initiValue();
    let isInVlaidExpression = false;
    this.regExps.forEach((regExp) => {
      regExp.isValid = this.testRegExpression(regExp.regExpression);
      if (!regExp.isValid && !regExp.isOptional) {
        isInVlaidExpression = true;
      }
    });

    this.onChange.emit(isInVlaidExpression);
  }

  testRegExpression(regExpression: RegExp) {
    return regExpression.test(this.value);
  }
}

在哪里

正则表达式

输入数组类是

export class RegExpValidator {
 regExpression: RegExp;
 message: string;
 ordinal: number;
 isValid: boolean = false;
 isOptional: boolean; }
  • 定义后,您可以按照以下两个步骤在目标组件中使用它:

    1-定义第一个输入参数,它是正则表达式本身的数组,验证消息以及它是否是可选的,如下所示:

    DefineRegExpressions(){
    let minPasswordLengthSixCharacters = new RegExpValidator();
    minPasswordLengthSixCharacters.message = " The password should be at least 6 charcters";
    minPasswordLengthSixCharacters.regExpression = /^.{6,}$/;
    minPasswordLengthSixCharacters.isOptional = false;
    
    let containsDigit = new RegExpValidator();
    containsDigit.message = "The password should contains at least 1 digit";
    containsDigit.regExpression = /\d/;
    containsDigit.isOptional = false;
    
    let containsLowerCharacter = new RegExpValidator();
    containsLowerCharacter.message = "The password should contains at least 1 lower charcter";
    containsLowerCharacter.regExpression = /.*[a-z].*/;
    containsLowerCharacter.isOptional = false;
    
    let containsUpperCharacter = new RegExpValidator();
    containsUpperCharacter.message = "The password should contains at least 1 upper charcter";
    containsUpperCharacter.regExpression = /.*[A-Z].*/;
    containsUpperCharacter.isOptional = false;
    
    let containsSymbol  = new RegExpValidator();
    containsSymbol.message = "The password contains at least 1 symbol @!#%&()^~{}";
    containsSymbol.regExpression = /[*@!#%&()^~{}]+/;
    containsSymbol.isOptional = true; }
    

然后定义第一个输入并将上面所有定义的表达式声明添加到它:

  regExps = Array<RegExpValidator>();
    this.regExps.push(minPasswordLengthSixCharacters);
    this.regExps.push(containsDigit);
    this.regExps.push(containsLowerCharacter);
    this.regExps.push(containsUpperCharacter);
    this.regExps.push(optional);

2- 最后将以下代码添加到您的目标组件 HTML 中:

  <app-reg-exp-validator [value]="password"
                                   [regExps]="regExps"
                                   (onChange)="onChangeRegExpValidator($event)">
            </app-reg-exp-validator>

在我们的例子中,值输入是指要验证的目标输入,它是密码,onChange 是自定义组件的输出,您可以使用它来了解所有验证是否有效。

于 2020-04-04T17:47:26.827 回答
0

更通用的密码/文本验证,您可以在其中选择每个类别中允许的字符数。

var regularExpression = new RegExp("^^(?=.*[A-Z]{"+minUpperCase+",})" +
    "(?=.*[a-z]{"+minLowerCase+",})(?=.*[0-9]{"+minNumerics+",})" +
    "(?=.*[!@#$\-_?.:{]{"+minSpecialChars+",})" +
    "[a-zA-Z0-9!@#$\-_?.:{]{"+minLength+","+maxLength+"}$");
if (pswd.match(regularExpression)) {
    //Success
}
于 2021-05-04T14:46:06.607 回答