正则表达式中的Unicode字符

13

我有一个正则表达式:

return Regex.IsMatch(_customer.FirstName, @"^[A-Za-z][A-Za-z0-9@#%&\'\-\s\.\,*]*$");

现在,一些客户在他们的姓氏或名字中会有元音字母上面的fada符号,比如下面这个例子:Brendán

请注意a字母上面的fada符号,您可以通过按住 alt , ctrl 并然后按 a 来获取它。

我尝试将这些字符添加到正则表达式中,但当程序尝试编译时出现错误。

唯一的方法是完全删除正则表达式,从而允许用户输入任何内容,包括带fada的字符。

有没有办法使用上面的表达式并以某种方式允许以下字符的输入?

á
é
í
ó
ú

编译器错误是什么? - Michael Liu
我在这里找到了一个重要链接:https://andrewwoods.net/blog/2018/name-validation-regex/。 - Bagesh Sharma
5个回答

23

仅供参考,您无需在字符类中的[]中转义上述字符',.,并且您可以通过将破折号-放置在字符类的开头或结尾来避免转义。

您可以使用\p{L}匹配任何语言中的任何字母。请参见下面的示例:

string[] names = { "Brendán", "Jóhn", "Jason" };
Regex rgx      = new Regex(@"^\p{L}+$");
foreach (string name in names)
    Console.WriteLine("{0} {1} a valid name.", name, rgx.IsMatch(name) ? "is" : "is not");

// Brendán is a valid name.
// Jóhn is a valid name.
// Jason is a valid name.

或者只需将您想要包含的字符添加到您的字符类[]中即可。

@"^[a-zA-Z0-9áéíóú@#%&',.\s-]+$"

9
尝试将\p{L}纳入其中,它可以匹配Unicode“字母”。因此,aá应该与\p{L}匹配。

5

要扩展您的正则表达式以包括带有重音符号(fada)的元音,您可以使用Unicode代码点。 您需要了解这些Unicode块:

更多Unicode代码图表请参见http://www.unicode.org/charts/index.html#scripts,涵盖了Latin Extended-B、-C和-D以及Latin Extended-Addional(应该涵盖几乎所有欧洲语言)。

因此,我们可以看到爱尔兰语的fada元音是:

  • Á\u00C1á\u00E1
  • É\u00C9é\u00E9
  • Í\u00CDí\u00ED
  • Ó\u00D3ó\u00F3
  • Ú\u00DAú\u00FA

因此,您的正则表达式需要进行扩展:

Regex rx = new Regex( @"^[A-Za-z\u00C1\u00C9\u00CD\u00D3\u00DA\u00E1\u00E9\u00ED\u00F3\u00FA][A-Za-z\u00C1\u00C9\u00CD\u00D3\u00DA\u00E1\u00E9\u00ED\u00F3\u00FA0-9@#%&\'\-\s\.\,*]*$");

1

\w(单词字符)包括Unicode字符。

因此,您的表达式可以是:

@"^\w[\w0-9@#%&\'\-\s\.\,*]*$"

将英文字母 A-Za-z 替换为 \w

1
我也曾经这么想,但实际上它并没有按照我的预期工作。http://regex101.com/r/pG5kS5 - Mike Perrenoud
\w字符类的问题在于它匹配了很多内容:Unicode字母,包括Ll(小写字母)、Lu(大写字母)、Lt(标题字母)、Lo(其他字母)、Lm(修饰字母)、Nd(十进制数字...包括不仅仅是ASCII的0-9)以及Pc(标点连接符)。 - Nicholas Carey
@MikePerrenoud 不能保证PHP的正则表达式库与C#的行为匹配,即使它们都是PCRE。从那个链接可以看出Python的正则表达式引擎匹配方式不同。 - jpaugh

0

尝试以下操作。它将帮助您...

return Regex.IsMatch(_customer.FirstName, @"^[0-9A-Za-z@#%&\'\-\s\.\,ñáéíóúü]+$");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接