2016-02-04 6 views
0

В настоящее время я изучаю 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. Но если слова - это что-то вроде «stackOverflow» (одна буква верхнего регистра, но не в начале строки), она берет его в финал. Есть ли простой способ предотвратить эту проблему?

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 

Они с истинным должны быть приняты и другие не должны быть приняты.

Что я хочу достичь, так это то, что регулярное выражение не должно добавлять, когда оно написано как this'rollsRoyce ', но если оно написано как «Rollsroyce» или «RollsRoyce», оно должно быть принято. Поэтому я должен проверить, есть ли заглавные буквы внутри строки.

+2

Какое правило фильтрации вы пытаетесь реализовать? Это не ясно из вашего вопроса. –

+1

Я не уверен точно, чего вы пытаетесь достичь с помощью своего оператора if, но я не думаю, что он будет делать то, что вы считаете из-за приоритета оператора (&& приходит до ||). Может быть. В любом случае: https://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx – LexyStardust

ответ

3

Существует очень простое решение без повтора х или LINQ:

bool hasUppercase = !str.equals(str.toLowerCase()); 

Теперь вы можете легко проверить:

if(!hasUppercase) { 
    // no uppercase letter 
} 

else { 
    // there is an uppercase letter 
} 

Просто проверить, если строка равна ее нижний регистр я.

+0

Мне интересно почему это принято, поскольку он не отвечает на вопрос OP в названии или самом вопросе («не содержит ни одного, ни одного письма в верхнем регистре, но не более»). –

+0

Вопрос был отредактирован. Этот ответ был первоначально применим. Очевидно, я сам этого не принял ... /: – Idos

8

Если вы хотите проверить, если строка содержит заглавную букву - это будет мой подход

string sValue = "stackOverflow"; 
bool result = !sValue.Any(x => char.IsUpper(x)); 

Update обновленному вопрос

string sValue = "stackOverflow"; 
bool result = sValue.Where(char.IsUpper).Skip(1).Any(); 

это игнорирует 1-й символ и определяет если остальная часть строки содержит хотя бы одну верхнюю букву

+4

Что вы можете упростить для 'bool result = sValue.Any (char.IsUpper)' –

Смежные вопросы