用于验证姓名的正则表达式?

尽管这似乎是一个琐碎的问题,但我很确定这不是一个小问题:)

我需要验证来自世界各地的人的名字和姓氏。想象一下一个巨大的名字和姓氏的缩略语列表,在这里我需要尽可能地删除我发现的所有碎片。我该如何使用正则表达式呢?如果只是英语,那我想这会减少它:

^[a-z -']+$

但是,我还需要支持以下情况:

  • 其他标点符号,因为它们可能会在不同的国家/地区使用(不知道使用哪个标点符号,但也许可以!)
  • 不同的Unicode字母集(重音字母,希腊语,日语,中文等)
  • 没有数字或符号或不必要的标点符号或符文等。
  • 标题,中间名首字母,后缀不是此数据的一部分
  • 名称已经由姓氏分隔。
  • 我们已准备好将超级稀有名称简化(存在一个名为“ @”的人,但在每个地方都不允许使用该字符是没有意义的。请务实且明智。)
  • 请注意,许多国家/地区都有关于名称的法律,因此需要遵循一些标准

我可以执行一些标准方法来验证这些字段,以确保我们的网站用户拥有丰富的经验,并且可以在列表中注册时实际 使用其名称 吗?

我会寻找与您可以在Google上找到的许多“电子邮件地址”正则表达式类似的东西。

回答:

我会尝试自己给出一个正确的答案:

名称中唯一应允许的标点是句号,撇号和连字符。在角落案例列表中,我还没有看到其他案例。

关于数字,只有一个8的情况。我想我可以放心地拒绝。

关于字母,任何字母都是有效的。

我也想包括空间。

这将总结为这个正则表达式:

^[\p{L} \.'\-]+$

这提出了一个问题,即撇号可以用作攻击媒介。它应该被编码。

因此,验证代码应如下所示(未经测试):

var name = nameParam.Trim();

if (!Regex.IsMatch(name, "^[\p{L} \.\-]+$"))

throw new ArgumentException("nameParam");

name = name.Replace("'", "'"); //' does not work in IE

谁能想到一个名称不能通过该测试或可能通过的XSS或SQL注入的原因?


完整的测试解决方案

using System;

using System.Text.RegularExpressions;

namespace test

{

class MainClass

{

public static void Main(string[] args)

{

var names = new string[]{"Hello World",

"John",

"João",

"タロウ",

"やまだ",

"山田",

"先生",

"мыхаыл",

"Θεοκλεια",

"आकाङ्क्षा",

"علاء الدين",

"אַבְרָהָם",

"മലയാളം",

"상",

"D'Addario",

"John-Doe",

"P.A.M.",

"' --",

"<xss>",

"\""

};

foreach (var nameParam in names)

{

Console.Write(nameParam+" ");

var name = nameParam.Trim();

if (!Regex.IsMatch(name, @"^[\p{L}\p{M}' \.\-]+$"))

{

Console.WriteLine("fail");

continue;

}

name = name.Replace("'", "&#39;");

Console.WriteLine(name);

}

}

}

}

以上是 用于验证姓名的正则表达式? 的全部内容, 来源链接: utcz.com/qa/434156.html

回到顶部