web-dev-qa-db-ja.com

ユーザー名を検証するための正規表現

これらの基準に対してユーザー名を検証する正規表現を作成しようとしています。

  1. 英数字文字、アンダースコアおよびドットのみが含まれます。
  2. アンダースコアとドットは、ユーザー名のendまたはstartには使用できません(例:_username/username_/.username/username.)。
  3. アンダースコアとドットは隣同士(例:user_.name)。
  4. アンダースコアまたはドットは複数回使用できません連続(例:user__name/user..name)。
  5. 文字数は8〜20の間でなければなりません。

これは私がこれまでにやったことです。すべての基準ルールを強制するように思えますただし、5番目のルール。これに5番目のルールを追加する方法がわかりません。

 ^[a-zA-Z0-9]+([._]?[a-zA-Z0-9]+)*$
39
^(?=.{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
175
Ωmega

フィリップの答えをわずかに修正することで最新の要件が修正されます

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

ここで先読み式を使用する必要があると思います。 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 _の後に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)

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

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

^#行の始まり

[a-z0-9_-]#リスト内の文字と記号、a-z、0-9、アンダースコア、ハイフンに一致

{3,15}#少なくとも3文字、最大15文字の長さ

$#行の終わり

1
Mehul Jariwala

正規表現が大好きなのと同様に、読みやすいものには限界があると思います

だから私はお勧めします

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

長くなりますが、保守担当者がexpressoを開いて理解する必要はありません。

長い正規表現にコメントすることはできますが、それを読む人は信頼に頼らなければなりません。

1
James Kyburz

これはトリックを行う必要があります:

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
} 
0
ridgerunner

申し訳ありませんが、私は自分のライブラリからこれを生成し、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

0
user1294594