如果我有一个LastName,FirstName,我有一个应该返回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;
}
答案 0 :(得分:2)
您的"^\\[A-Za-z0-9_']+\\s?,\\s?\\[A-Za-z0-9_']+"
在文字符号中看起来像^\[A-Za-z0-9_']+\s?,\s?\[A-Za-z0-9_']+
,它匹配字符串的开头(^
),后跟文字[
和文字序列{ {1}}后跟一个或多个A-Za-z0-9_'
,一个或零个空格,一个逗号,一个或零个空格等。
您需要移除]
之前的\\
并在结尾处添加[
:
$
另一种写作方式 - 使用^[A-Za-z0-9_']+\s?,\s?[A-Za-z0-9_']+$
代替\w
[A-Za-z0-9_]
修饰符,仅匹配ASCII字母和数字(ryanyuyu suggests ):
RegexOptions.ECMAScript
请注意,如果没有^[\w']+\s?,\s?[\w']+$
修饰符,RegexOptions.ECMAScript
会匹配.NET flavor中的\w
- 所有Unicode字母和数字。
请参阅regex demo
[\p{L}\p{M}\p{N}_]
是一个文字\\
,它使正则表达式引擎将\
视为文字[
。 [
是字符串结束锚,因此名称后不会出现任何内容。
C#(使用逐字字符串文字,它们使定义正则表达式更容易):
$
请参阅demo:
@"^[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;
}
}
水平空白Unicode类别类而不是\p{Zs}
可能更安全。
进一步优化:
以前的表达式允许\s
字符串。要禁止它们,请使用
','
或ASCII版本:
@"^(?:\p{L}+')?\w+\s?,\s?(?:\p{L}+')?\w+$"
答案 1 :(得分:1)
通过一些调试,以下正则表达式似乎可以工作;
if (Regex.IsMatch(input, @"^[A-Za-z0-9_']+s?, s?[A-Za-z0-9_']+$")) {
return true;
}
答案 2 :(得分:0)
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