1

ユーザー名を検証するための正規表現を探しています。

ユーザー名には次のものが含まれる場合があります。

  • 文字(西洋、ギリシャ、ロシアなど)
  • 数字
  • スペース、ただし一度に 1 つだけ
  • 特殊文字 (例: "!@#$%^&*.:;<>?/\|{}[]_+=-") 、ただし一度に 1 つだけ

編集:

混乱させて申し訳ありません

  • ココアタッチには必要ですが、とにかくサーバー側のphpに翻訳する必要があります。
  • 一度に 1 つとは、スペースまたは特殊文字を文字または数字で区切る必要があることを意味します。
4

5 に答える 5

8

1 つの大きな正規表現を記述する代わりに、個別の正規表現を記述して、必要な各条件をテストする方が明確です。

  • ユーザー名に文字、数字、 から までの ASCII 記号、およびスペースのみが含まれているかどうかをテスト!@ます^(\p{L}|\p{N}|[!-@]| )+$。ユーザー名が有効であるためには、これが一致する必要があります。\p{L}Unicode 文字のクラスと Unicode 番号のクラスの使用に注意してください\p{N}

  • ユーザー名に連続したスペースが含まれているかどうかをテストします: \s\s+. これが一致する場合、ユーザー名は無効です。

  • シンボルが連続して発生するかどうかをテストします: [!-@][!-@]+. これが一致する場合、ユーザー名は無効です。

これは、書かれているとおりに基準を満たしています。

ただし、ユーザー名の書き方によっては、「Éponine」のような完全に有効な名前でも、このアプローチでは拒否される場合があります。これは、"É" が、U+00C9 LATIN CAPITAL E WITH ACUTE (これは と一致する\p{L}) またはEU+02CA MODIFIER LETTER ACUTE ACCENT (と一致しない\p{L}) のようなものとして記述できるためです。

Regular-Expressions.info はそれをよりよく言います:

繰り返しますが、「文字」は実際には「Unicode コード ポイント」を意味します。\p{L} は、カテゴリ「文字」の単一のコード ポイントに一致します。入力文字列が U+0061 U+0300 としてエンコードされている場合、アクセントのない a に一致します。入力が U+00E0 としてエンコードされている場合、アクセントと一致します。その理由は、コード ポイント U+0061 (a) と U+00E0 (à) の両方がカテゴリ「文字」にあるのに対し、U+0300 はカテゴリ「マーク」にあるためです。

Unicode は毛むくじゃらであり、ユーザー名の文字を制限することは必ずしも良い考えではありません。これを実行してもよろしいですか?

于 2012-04-24T14:52:12.457 に答える
1

表現

^(\w| (?! )|["!@#$%^&*.:;<>?/\|{}\[\]_+=\-")](?!["!@#$%^&*.:;<>?/\|{}\[\]_+=\-")]))*$

方言が先読みアサーションをサポートしている場合は、ほとんどの場合、必要な処理を実行します。RegExrで実際の動作を確認してください。

この方法でユーザー名を制限する理由を自問してください。ほとんどの場合、「!!」で始まるユーザー名 問題ではないはずです。希望するユーザー名を拒否すると、ユーザーを困らせることになります。

編集: \w非ラテン文字とは一致しません。これを行うには、正規表現の実装に応じて、動作する場合と動作しない場合があるwich\wに置き換えます。\p{L}残念ながら、正規表現はそれをサポートしていません。

于 2012-04-24T13:33:38.333 に答える
1

これを試して:

^[!@#$%^&*.:;<>?\/\|{}\[\]_+= -]?([\p{L}\d]+[!@#$%^&*.:;<>?/\|{}\[\]_+= -]?)+$

紅斑を見る

于 2012-04-24T13:35:14.000 に答える
0

このソリューションがどの言語で必要なのかわからないため、Java で回答します。他のどのプラットフォームでも翻訳できます。

String str = "à123 àà@bcà#";
String regex = "^([\\p{L}\\d]+[!@#$%\\^&\\*.:;<>\\?/\\|{}\\[\\]_\\+=\\s-]?)+$";
Pattern p = Pattern.compile(regex);
matcher = p.matcher(str);
if (matcher.find())
   System.out.println("Matched: " + matcher.group());

私が行った 1 つの仮定は、ユーザー名が Unicode 文字または数字で始まるということです。

于 2012-04-24T13:47:28.440 に答える
0

あなたは次のようなものが欲しい

string strUserName = "BillYBob Stev#nS0&";
Regex regex = new Regex(@"(?i)\b(\w+\p{P}*\p{S}*\p{Z}*\p{C}*\s?)+\b");
Match match = regex.Match(strUserName);

この説明が必要な場合は、お知らせください。

これが役立つことを願っています。

注: これは大文字と小文字を区別しません。

于 2012-04-24T13:38:27.533 に答える