91

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

  1. 英数字アンダースコアドットのみが含まれます。
  2. アンダースコアとドットをユーザー名の末尾または 先頭にすることはできません(例: _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]+)*$
4

11 に答える 11

365
^(?=.{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})[^_.].*[^_.]$
于 2012-08-18T13:52:40.120 に答える
14

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

だから私は提案します

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を開いて理解する必要はありません。

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

于 2012-08-18T13:45:54.600 に答える
13

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

_(?!\.)_の後に。が続きません。また

\.(?!_)。_ORが続かない

[a-zA-Z0-9]英数字)FOR

{6,18}最小6回から最大18回

[a-zA-Z0-9]英数字

(最初の文字は英数字、次に6〜18文字、最後の文字は英数字、6 + 2 = 8、18 + 2 = 20)

于 2012-08-18T11:51:30.997 に答える
8

フィリップの回答にわずかな変更を加えると、最新の要件が修正されます

^[a-zA-Z0-9]([._](?![._])|[a-zA-Z0-9]){6,18}[a-zA-Z0-9]$
于 2012-08-18T12:36:28.803 に答える
3
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");
        }
    }
}
于 2018-10-06T12:12:05.910 に答える
3
^(?=.{4,20}$)(?:[a-zA-Z\d]+(?:(?:\.|-|_)[a-zA-Z\d])*)+$

ここで正規表現をテストできます

于 2019-11-08T17:37:09.383 に答える
1

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

^#行の先頭

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

{3,15}#長さは3文字以上、最大長は15文字

$#行の終わり

于 2017-04-17T15:38:01.727 に答える
0

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

于 2012-08-18T12:36:18.590 に答える
0

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

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
} 
于 2012-08-18T13:40:43.657 に答える
0
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}`);
    });
}
于 2021-10-11T09:48:48.963 に答える
-2
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';
    }
  }
于 2020-10-20T17:29:13.440 に答える