Skip to main content
 首页 » 编程设计

c#之ClassName.PropertyName 的正则表达式

2024年02月25日28oomusou

我不知道正则表达式,

但是我需要正则表达式来计算ClassName.PropertyName吗?

需要验证 appSettings 中的一些值是否符合 ClassName.PropertyName 约定

"ClassName.PropertyName" - 这是唯一有效的格式,下面的其余格式无效:

"Personnel.FirstName1"   <- the only string that should match 
"2Personnel.FirstName1" 
"Personnel.33FirstName" 
"Personnel..FirstName" 
"Personnel.;FirstName" 
"Personnel.FirstName." 
"Personnel.FirstName   " 
" Personnel.FirstName" 
" Personnel. FirstName" 
" 23Personnel.3FirstName" 

我已经试过了(从作为重复发布的链接):

 ^\w+(.\w+)*$ 

但它不起作用:我有误报,例如2Personnel.FirstName1 以及 Personnel.33FirstName 通过了检查,而两者都应该被拒绝。

有人可以帮我吗?

请您参考如下方法:

让我们从单个标识符开始:

  1. 它的第一个字符必须是字母或下划线
  2. 它可以包含字母、下划线和数字

所以标识符的正则表达式是

[A-Za-z_][A-Za-z0-9_]* 

接下来,我们应该用 . 链接标识符(不要忘记转义 . )一个标识符后跟零个或多个 . + 标识符:

^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$ 

如果它必须是恰好两个标识符(而不是,比如 abc.def.hi - 三个)

^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$ 

测试:

string[] tests = new string[] { 
  "Personnel.FirstName1",  // the only string that should be matched 
  "2Personnel.FirstName1", 
  "Personnel.33FirstName", 
  "Personnel..FirstName", 
  "Personnel.;FirstName", 
  "Personnel.FirstName.", 
  "Personnel.FirstName   ", 
  " Personnel.FirstName", 
  " Personnel. FirstName", 
  " 23Personnel.3FirstName", 
} ; 
 
string pattern = @"^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$"; 
 
var results = tests 
  .Select(test =>  
    $"{"\"" + test + "\"",-25} : {(Regex.IsMatch(test, pattern) ? "matched" : "failed")}""); 
 
Console.WriteLine(String.Join(Environment.NewLine, results)); 

结果:

"Personnel.FirstName1"    : matched 
"2Personnel.FirstName1"   : failed 
"Personnel.33FirstName"   : failed 
"Personnel..FirstName"    : failed 
"Personnel.;FirstName"    : failed 
"Personnel.FirstName."    : failed 
"Personnel.FirstName   "  : failed 
" Personnel.FirstName"    : failed 
" Personnel. FirstName"   : failed 
" 23Personnel.3FirstName" : failed 

编辑:如果特定于文化的名称(如äöü.FirstName)应该被接受(参见Rand Random 的评论)那么[A-Za-z]范围应更改为 \p{L} - 任何字母。异国情调的可能性 - 特定于文化的数字(例如波斯数字 - ۰۱۲۳۴۵۶۷۸۹ )可以通过更改 0-9 来解决。进入\d

// culture specific letters, but not digits  
string pattern = @"^[\p{L}_][\p{L}0-9_]*(?:\.[\p{L}_][\p{L}0-9_]*)*$"; 

如果每个标识符不应超过一定长度(例如,16),我们应该重新设计初始标识符模式:强制字母或下划线后跟[0..16-1] == {0,15}字母、数字或下划线

[A-Za-z_][A-Za-z0-9_]{0,15} 

我们有

string pattern = @"^[A-Za-z_][A-Za-z0-9_]{0,15}(?:\.[A-Za-z_][A-Za-z0-9_]{0,15})*$";