我想验证字符串字段以确保每个字符串的第一个字母是大写的。
例如:
"My Name Is Jaas" - This is valid
"My name is Jaas" - Is Invalid because 'name' and 'is' start with lower-case letter.
我想在C#中使用正则表达式来验证这一点。什么是正确的正则表达式?
答案 0 :(得分:3)
所以我不会将这种约束强加于每个人的'验证',而是做一个简单的转换。您的用户会感谢您。
另外,虽然我是正则表达式的忠实粉丝,但有一种情况我觉得没有它会更好。
您可以使用以下内容:
TextInfo textInfo = new CultureInfo("en-US",false).TextInfo;
string formatted = textInfo.ToTitleCase( "yOur STRING hErE" );
如果您仍然坚持使用验证,则可以比较格式前和格式后的值。
PS:你需要这个名称空间using System.Globalization;
答案 1 :(得分:2)
在这里看起来你不需要任何正则表达式。使用LINQ .Split().All(p => p.Substring(0, 1) == p.Substring(0, 1).ToUpper())
检查所有单词是否包含大写的第一个字符(不要忘记使用语句添加System.Linq
和System.Xml.Linq
):
var tst = "My Name Is Jaas";
var ntst = "My name is Jaas";
var pass = tst.Split().All(p => p.Substring(0, 1) == p.Substring(0, 1).ToUpper());
var fail = ntst.Split().All(p => p.Substring(0, 1) == p.Substring(0, 1).ToUpper());
输出:
pass = true
fail = false
如果你坚持使用正则表达式,你可以使用以下一个:
var rxTitleCase = new Regex(@"^(\p{Lu}\p{L}*\s*)+$");
var tstSuccess = rxTitleCase.IsMatch(tst);
var tstFail = rxTitleCase.IsMatch(ntst);
输出与上述相同。
答案 2 :(得分:0)
如果您确定输入始终用一个空格分隔,则可以在每个空格上拆分输入,并检查每个单词的第一个字符是否为char.IsUpper
大写:
.Split().All(w => char.IsUpper(w[0]));
例如:
var correct = "My Name Is Jaas";
var incorrect = "My name is Jaas";
bool willbeTrue = correct.Split().All(w => char.IsUpper(w[0]));
bool willBeFalse = incorrect.Split().All(w => char.IsUpper(w[0]));
如果它可以包含多个空格,则可以删除此String.Split
重载的空条目:
.Split(new[]{' '}, StringSplitOptions.RemoveEmptyEntries).All(w => char.IsUpper(w[0]));
答案 3 :(得分:0)
此Rexex应该可以满足您的要求......
var pattern = @"^([\S-[a-z]]\S*\s*)+$";
var test = "My Name Is Jaas";
var test2 = "My name is Jaas";
var test3 = "My Name Is Jaas The 3rd";
var rx = new Regex(pattern);
var t1 = rx.IsMatch(test);
var t2 = rx.IsMatch(test2);
var t3 = rx.IsMatch(test3);
模式[\ S- [a-z]]表示除小写字母外的任何非空白字符。我是这样做的,因为你说你想要正确的案例,我不能确定你的子串是否可能以非字母字符开头。您的示例很简单,但如果您的实际数据变得更复杂,我会将其作为开始的地方。
顺便说一句,它与stribizhev的正则表达式非常相似。