正则表达式允许至少一个特殊字符,一个大写,一个小写(以任何顺序)

时间:2012-05-11 19:26:27

标签: regex

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

这是我到目前为止所做的:

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

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

非常感谢任何帮助

5 个答案:

答案 0 :(得分:21)

你的正则表达式

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

实际上应该可以正常工作,但是你可以通过删除第一个.*来提高效率:

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

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

答案 1 :(得分:4)

这是一个你可以使用的功能。

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,则条件满足。

答案 2 :(得分:2)

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

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

别忘了调整特殊字符列表。因为我不知道你认为哪些角色很特别。

我相信在单行正则表达式上浪费大量时间而你不是专家则不会提高你的工作效率。这3个正则表达式解决方案会做得很好。它节省了时间。

答案 3 :(得分:0)

如果您希望输出如下图所示:

Password Validator

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

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);
  }
}

其中

regExps

输入数组类为

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是自定义组件的输出,您可以使用它来了解是否所有验证 是否有效。

答案 4 :(得分:0)

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

@Test