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;
}
您的"^''[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 中使用。