사용자 이름을 검증하는 정규 표현
다음 기준에 따라 사용자 이름을 검증하기 위한 정규 표현을 작성하려고 합니다.
- 밑줄과 도트 등 영숫자만 사용할 수 있습니다.
- 사용자 이름의 끝이나 시작에는 밑줄과 도트를 사용할 수 없습니다(예:
_username/username_/.username/username.). - 밑줄과 도트는 옆에 둘 수 없습니다(예:
user_.name). - 언더스코어 또는 도트는 연속해서 여러 번 사용할 수 없습니다(예:
user__name/user..name). - 글자 수는 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
'source' 카테고리의 다른 글
| 구분 기호는 영숫자 또는 백슬래시 및 preg_match일 수 없습니다. (0) | 2023.01.15 |
|---|---|
| 이 연결은 현재 {tls_version}을(를) 사용하고 있으며 Linux에서 Flask 애플리케이션을 배포할 수 없습니다. (0) | 2023.01.15 |
| @Autowired - 종속성에 적합한 빈 유형을 찾을 수 없습니다. (0) | 2023.01.06 |
| 옵션 경로 매개 변수를 사용한 Respect Router (0) | 2023.01.06 |
| Python 소스 코드에서 UML 다이어그램을 생성하는 가장 좋은 방법은 무엇입니까? (0) | 2023.01.06 |