Подтвердить что ты не робот

Регулярное выражение для проверки имени пользователя

Я пытаюсь создать регулярное выражение для проверки имен пользователей по этим критериям:

  • Только содержит буквенно-цифровые символы, подчеркивание и точка.
  • Подчеркивание и точка не могут быть в конце или начало имени пользователя (например, _username/username_/.username/username.).
  • Подчеркивание и точка не могут быть рядом друг с другом (например, user_.name).
  • Подчеркивание или точка не могут использоваться несколько раз подряд (например, user__name/user..name).
  • Количество символов должно быть от 8 до 20.

Это то, что я сделал до сих пор; это звучит, что он применяет все критерии, но пятое правило. Я не знаю, как добавить к этому 5-е правило:

 ^[a-zA-Z0-9]+([._]?[a-zA-Z0-9]+)*$
4b9b3361

Ответ 1

^(?=.{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

Ответ 2

Небольшая модификация ответа Филлипа устраняет последнее требование

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

Ответ 3

Думаю, вам придется использовать выражения Lookahead здесь. http://www.regular-expressions.info/lookaround.html

Try

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

[a-zA-Z0-9] буквенно-цифровой THEN (

_(?!\.) a _, за которым следует a. ИЛИ

\.(?!_) a. не сопровождаемый _ OR

[a-zA-Z0-9] алфавитно-цифровой) FOR

{6,18} минимум 6 до максимума 18 раз THEN

[a-zA-Z0-9] алфавитно-цифровой

(Первый символ - буквенно-цифровой, затем от 6 до 18 символов, последний символ - буквенно-цифровой, 6 + 2 = 8, 18 + 2 = 20)

Ответ 4

Насколько я люблю регулярные выражения, я думаю, что существует предел тому, что читается

Поэтому я предлагаю

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

Это дольше, но разработчику не нужно будет открывать выражение для понимания.

Конечно, вы можете прокомментировать длинное регулярное выражение, но затем, кто когда-либо читал, он должен полагаться на доверие.......

Ответ 5

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

^ # Начало строки

[a-z0-9_-] # Соответствие символов и символов в списке, a-z, 0-9, подчеркивание, дефис

{3,15} # Длина не менее 3 символов и максимальная длина 15

$# Конец строки

Ответ 6

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

Ответ 7

Err sorry я сгенерировал это из своей собственной библиотеки, и он использует синтаксис, действительный для 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

Ответ 8

Это нужно сделать трюк:

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
}