source

사용자 이름을 검증하는 정규 표현

bestscript 2023. 1. 15. 17:27

사용자 이름을 검증하는 정규 표현

다음 기준에 따라 사용자 이름을 검증하기 위한 정규 표현을 작성하려고 합니다.

  1. 밑줄과 도트 등 영숫자사용할 수 있습니다.
  2. 사용자 이름의 끝이나 시작에는 밑줄과 도트를 사용할 수 없습니다(예:_username/username_/.username/username.).
  3. 밑줄과 도트는 에 둘 수 없습니다(예:user_.name).
  4. 언더스코어 또는 도트는 연속해서 여러 번 사용할 수 없습니다(예:user__name/user..name).
  5. 글자 수는 8~20자 사이여야 합니다.

이것이 내가 지금까지 해 온 것이다; 다섯 번째 규칙을 제외한 모든 기준 규칙을 적용하는 것처럼 들린다.여기에 다섯 번째 규칙을 추가하는 방법을 모릅니다.

 ^[a-zA-Z0-9]+([._]?[a-zA-Z0-9]+)*$
^(?=.{8,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$
 └─────┬────┘└───┬──┘└─────┬─────┘└─────┬─────┘ └───┬───┘
       │         │         │            │           no _ or . at the end
       │         │         │            │
       │         │         │            allowed characters
       │         │         │
       │         │         no __ or _. or ._ or .. inside
       │         │
       │         no _ or . at the beginning
       │
       username is 8-20 characters long

브라우저가 네거티브한 룩백지원을 하지 않아 오류가 발생할 경우 다음 대체 패턴을 사용하십시오.

^(?=[a-zA-Z0-9._]{8,20}$)(?!.*[_.]{2})[^_.].*[^_.]$

여기서 Lookahead 표현을 써야 할 것 같아요.http://www.regular-expressions.info/lookaround.html

해라

^[a-zA-Z0-9](_(?!(\.|_))|\.(?!(_|\.))|[a-zA-Z0-9]){6,18}[a-zA-Z0-9]$

[a-zA-Z0-9]영숫자 THEN (

_(?!\.)a_ 뒤에 .OR이 붙지 않는다.

\.(?!_)a. 뒤에 _OR이 붙지 않는다.

[a-zA-Z0-9]영숫자) FOR

{6,18}최소 6회~최대 18회

[a-zA-Z0-9]영숫자

(첫 번째 문자는 영숫자, 그리고 6 ~ 18 문자, 마지막 문자는 영숫자, 6+2=8, 18+2=20)

나는 규칙적인 표현을 좋아하지만 읽을 수 있는 것에는 한계가 있다고 생각한다.

그래서 제가 제안하고 싶은 건

new Regex("^[a-z._]+$", RegexOptions.IgnoreCase).IsMatch(username) &&
!username.StartsWith(".") &&
!username.StartsWith("_") &&
!username.EndsWith(".") &&
!username.EndsWith("_") &&
!username.Contains("..") &&
!username.Contains("__") &&
!username.Contains("._") &&
!username.Contains("_.");

좀 더 길지만 관리자가 expreso를 열 필요는 없습니다.

물론 당신은 긴 정규식을 언급할 수 있지만, 그것을 읽는 사람은 신뢰에 의존해야 한다………

필립의 답변을 약간 수정하면 최신 요구 사항이 수정됩니다.

^[a-zA-Z0-9]([._](?![._])|[a-zA-Z0-9]){6,18}[a-zA-Z0-9]$
private static final Scanner scan = new Scanner(System.in);

public static void main(String[] args) {
    int n = Integer.parseInt(scan.nextLine());
    while (n-- != 0) {
        String userName = scan.nextLine();
        String regularExpression = "^[[A-Z]|[a-z]][[A-Z]|[a-z]|\\d|[_]]{7,29}$";
        if (userName.matches(regularExpression)) {
            System.out.println("Valid");
        } else {
            System.out.println("Invalid");
        }
    }
}
^(?=.{4,20}$)(?:[a-zA-Z\d]+(?:(?:\.|-|_)[a-zA-Z\d])*)+$

정규식을 테스트할 수 있습니다.

^[a-z0-9_-]{3,15}$

^ # 줄의 시작

[a-z0-9_-] # 목록의 문자와 기호를 일치시킵니다. a-z, 0-9, 밑줄, 하이픈

{3,15} # 길이 3자 이상 최대 15자

$ # 줄 끝

이거면 되겠네요.

if (Regex.IsMatch(text, @"
    # Validate username with 5 constraints.
    ^                          # Anchor to start of string.
    # 1- only contains alphanumeric characters , underscore and dot.
    # 2- underscore and dot can't be at the end or start of username,
    # 3- underscore and dot can't come next to each other.
    # 4- each time just one occurrence of underscore or dot is valid.
    (?=[A-Za-z0-9]+(?:[_.][A-Za-z0-9]+)*$)
    # 5- number of characters must be between 8 to 20.
    [A-Za-z0-9_.]{8,20}        # Apply constraint 5.
    $                          # Anchor to end of string.
    ", RegexOptions.IgnorePatternWhitespace))
{
    // Successful match
} else {
    // Match attempt failed
} 

에러 죄송합니다.이것은 제 라이브러리에서 생성되어 Dart/Javascript/Java/Python에 유효한 구문을 사용하고 있습니다만, 어쨌든 다음과 같습니다.

(?:^)(?:(?:[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKlMNOPQRSTUVWXYZ0123456789]){1,1})(?!(?:(?:(?:(?:_\.){1,1}))|(?:(?:(?:__){1,1}))|(?:(?:(?:\.\.){1,1}))))(?:(?:(?:(?:[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKlMNOPQRSTUVWXYZ0123456789._]){1,1})(?!(?:(?:(?:(?:_\.){1,1}))|(?:(?:(?:__){1,1}))|(?:(?:(?:\.\.){1,1}))))){6,18})(?:(?:[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKlMNOPQRSTUVWXYZ0123456789]){1,1})(?:$)

내 라이브러리 코드:

var alphaNumeric = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "l", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
var allValidCharacters = new List.from(alphaNumeric);
allValidCharacters.addAll([".", "_"]);

var invalidSequence = (r) => r
  .eitherString("_.")
  .orString("__")
  .orString("..");

var regex = new RegExpBuilder()
  .start()
  .exactly(1).from(alphaNumeric).notBehind(invalidSequence)
  .min(6).max(18).like((r) => r.exactly(1).from(allValidCharacters).notBehind(invalidSequence))
  .exactly(1).from(alphaNumeric)
  .end()
  .getRegExp();

내 라이브러리: https://github.com/thebinarysearchtree/RegExpBuilder

const regex = /^moe_(app|lab)[A-Za-z0-9]{3}$/;
const str = `moe_app_baa`;
let m;

if ((m = regex.exec(str)) !== null) {
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

다른 질문에서 우연히 이 질문을 발견했다.그렇게 많은 룩어라운드를 사용할 필요는 없을 것 같네요.단어 문자줄임말이며 일반적으로 사전 설정되는 짧은 패턴을 사용하여 조금 더 짧은 패턴을 따릅니다.[A-Za-z0-9_]. 밑줄을 없애려면 , 를 사용하여 일치시킬 수 있습니다.[A-Za-z0-9].

^[^\W_](?!.*?[._]{2})[\w.]{6,18}[^\W_]$
  • ^[^\W_]첫머리에 한 글자 또는 숫자
  • (?!.*?[._]{2})거부하기 위한 부정적인 전망__ ._ _. ..
    (긴 입력의 스텝을 줄이기 위해, 느린 정량자가 사용됩니다..*?)
  • [\w.]{6,18}문자, 숫자, 숫자, 6~18자까지 사용할 수 있습니다._ ★★★★★★★★★★★★★★★★★」.
  • [^\W_]$

regex101에서 데모를 참조하십시오(자세한 내용은 오른쪽 참조).

주의:\w환경/문자에 따라 유니코드 문자와 숫자를 추가로 포함할 수 있습니다.

function isUserName(val){
    let regUser=/^[a-zA-Z0-9](_(?!(\.|_))|\.(?!(_|\.))|[a-zA-Z0-9]){6,18}[a-zA-Z0-9]$/;
    if(!regUser.test(val)){
      return 'Name can only use letters,numbers, minimum length is 8 characters';
    }
  }

언급URL : https://stackoverflow.com/questions/12018245/regular-expression-to-validate-username