REGEX 用于姓氏,名字

本文关键字:名字 用于 REGEX | 更新日期: 2023-09-27 18:32:31

我有一个函数,如果我有一个姓氏,名字,它应该返回 True。

此名称返回 False,但应返回 True。 知道为什么吗?我希望能够接受名称中的撇号、A-Z、a-z、下划线和 0-9。 我在逗号之前和之后可能有也可能没有空格。

此测试名称失败:"D'Antonio, Patricia">

代码是:

public static bool IsName(string input)
{
     if (string.IsNullOrEmpty(input)) return false;
     if (System.Text.RegularExpressions.Regex.Match(input, "^''[A-Za-z0-9_']+''s?,''s?''[A-Za-z0-9_']+").Success) return true;
     return false;
    }

REGEX 用于姓氏,名字

您的"^''[A-Za-z0-9_']+''s?,''s?''[A-Za-z0-9_']+"在文字表示法中看起来像^'[A-Za-z0-9_']+'s?,'s?'[A-Za-z0-9_']+,它匹配字符串的开头(^(,后跟文字[A-Za-z0-9_'的文字序列,后跟一个或多个]、一个或零个空格、一个逗号、一个或零个空格等。

您需要删除[之前的'',并在末尾添加$

^[A-Za-z0-9_']+'s?,'s?[A-Za-z0-9_']+$

另一种编写方式 - 使用 'w 而不是[A-Za-z0-9_] RegexOptions.ECMAScript修饰符仅匹配 ASCII 字母和数字(如 ryanyuyu 建议的那样(:

^['w']+'s?,'s?['w']+$

请注意,如果没有 RegexOptions.ECMAScript 修饰符,'w ['p{L}'p{M}'p{N}_] .NET 风格中匹配 - 所有 Unicode 字母和数字。

查看正则表达式演示

''是一个文字',使正则表达式引擎将[视为文字[$是字符串结束锚点,因此名称后不会出现任何内容。

C#(使用逐字字符串文字,它们使定义正则表达式更容易(:

@"^[A-Za-z0-9_']+'s?,'s?[A-Za-z0-9_']+$"

查看演示:

using System;
using System.Text.RegularExpressions;
using System.IO;
public class Test
{
    public static void Main()
    {
        Console.WriteLine(IsName("D'Antonio, Patricia"));
    }
    public static bool IsName(string input)
    {
         if (string.IsNullOrEmpty(input)) return false;
         if (Regex.IsMatch(input, @"^[A-Za-z0-9_']+'s?,'s?[A-Za-z0-9_']+"))
            return true;
         else
            return false;
    }
}

此外,如果有机会输入换行符,则使用'p{Zs}水平空格 Unicode 类别类可能比's更安全。

进一步优化:

前面的表达式允许','字符串。要禁止它们,请使用

@"^(?:'p{L}+')?'w+'s?,'s?(?:'p{L}+')?'w+$"

或 ASCII 版本:

@"^(?:[A-Za-z0-9_]+')?[A-Za-z0-9_]+'s?,'s?(?:[A-Za-z0-9_]+')?[A-Za-z0-9_]+$

通过一点点调试,以下正则表达式似乎可以工作;

if (Regex.IsMatch(input, @"^[A-Za-z0-9_']+s?, s?[A-Za-z0-9_']+$")) {
    return true;
}
string pattern = @"(?x) ^ ['w ']+ , ['w ']+ $ ";
Regex r = new Regex(pattern);
Console.WriteLine(r.Match("D'Antonio, Patricia")); //D'Antonio, Patricia
Console.WriteLine(r.Match("D_Antonio, Patricia")); //D_Antonio, Patricia
Console.WriteLine(r.Match("D_Antonio, Patricia01")); //D_Antonio, Patricia01
Console.WriteLine(r.Match("D-Antonio, Patricia01")); //No Match
  • [''w'''d]+ 将匹配任何单词字符、连字符和任何数字,一次或多次 (+(。
  • ^ 和 $ 将匹配整个字符串,而不是其中的一部分。
  • (?x( 是一个正则表达式选项,它将忽略模式中的空格。''w 允许单词字符、空格、下划线和任何数字在 .Net 中使用。