c# - ClassName.PropertyName 的正则表达式
问题描述
我不知道Regex
,
但我需要有正则表达式来评估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
通过了检查。
有人可以帮我吗?
解决方案
让我们从单个标识符开始:
- 它的第一个字符必须是字母或下划线
- 它可以包含字母、下划线和数字
所以标识符的正则表达式是
[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
编辑:如果应该接受文化特定名称(如)(请参阅 Rand Random 的评论),则范围应更改为-任何字母。异国情调的可能性 - 文化特定的数字(例如波斯数字 - )可以通过更改为来解决äöü.FirstName
[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})*$";
推荐阅读
- java - 如何在java中读取嵌套的json列表?
- javascript - Firestore:react Native 中无限滚动的 geohash 查询中的 startAt
- firebase - 跨不同时区的时间段的 Firebase 预订
- c# - 循环数组以查找重复项
- migration - 将 log4j.properties 文件从 Log4j 版本 1 迁移到 2 的合适指南
- ruby-on-rails - 在 RSpec 中测试实例方法时,我的空数组参数没有被读取
- node.js - 更新未验证 Mongoose 连接
- python - sublime text3 不显示 utf8 字符,而是显示它们的代码
- apache-spark - 如何使用 PySpark RDD api 找到哪个句子的单词数最多?
- php - create.blade.php 显示 404| 未找到