我目前正在学习C#和RegEx
。我正在研究一个小的wordcrawler。我得到了许多单词的大清单,我可以逃避那些不适合我的RegEx的单词。
这是我的代码:
var WordRegex = new Regex("^[a-zA-Z]{4,}$", RegexOptions.Compiled | RegexOptions.CultureInvariant);
var secondRegex = new Regex("([A-Z]{1})");
var words = new List<string>();
var finalList = new List<string>();
foreach (var word in words)
{
if (WordRegex.IsMatch(word) && secondRegex.Matches(word).Count == 1 || secondRegex.Matches(word).Count == 0)
{
finalList.Add(word);
}
}
如果这个词是“麦克拉伦”,那么这个工作正常。 (两个大写字母)它不会将它添加到finalList。但是,如果这些词语类似于&#39; stackOverflow&#39; (一个大写字母,但不是字符串的开头),它确实把它作为finallist。有没有简单的方法来防止这个问题?
PS:如果有比RegEx更好的方式让我知道!
以下是一些例子:
("McLaren");//false
("Nissan");//true
("BMW");//false
("Subaru");//true
("Maserati");//true
("Mercedes Benz");//false
("Volkswagen");//true
("audi");//true
("Alfa Romeo");//false
("rollsRoyce");//false
("drive");//true
这些应该被接受,而另一个则不被接受。
我想要达到的是正则表达式不应该在这样写的时候添加&#39; rollsRoyce&#39;但如果它写得像罗尔斯罗伊斯那样#39;或者&#39; RollsRoyce&#39;它应该被接受。所以我必须检查字符串中是否有大写字母。
答案 0 :(得分:8)
如果你想检查字符串是否包含一个大写字母 - 这将是我的方法
string sValue = "stackOverflow";
bool result = !sValue.Any(x => char.IsUpper(x));
更新以更新问题
string sValue = "stackOverflow";
bool result = sValue.Where(char.IsUpper).Skip(1).Any();
这会忽略第一个字符并确定字符串的其余部分是否包含至少一个大写字母
答案 1 :(得分:3)
没有正则表达式或linq,有一个非常简单的解决方案:
bool hasUppercase = !str.equals(str.toLowerCase());
现在您可以轻松查看:
if(!hasUppercase) {
// no uppercase letter
}
else {
// there is an uppercase letter
}
检查字符串是否等于其小写的自我。