2016-02-05 2 views
-2

Я работаю над фильтром для списка слов.Проверьте, содержит ли строка верхнюю букву «внутри»

Так вот несколько примеров слов, которые внутри словника:

var words = new List<string>(); 
var finalList = new List<string>(); 

words.Add("McLaren");//false 
words.Add("Nissan");//true 
words.Add("BMW");//false 
words.Add("Subaru");//true 
words.Add("Maserati");//true 
words.Add("Mercedes Benz");//false 
words.Add("Volkswagen");//true 
words.Add("audi");//true 
words.Add("Alfa Romeo");//false 
words.Add("rollsRoyce");//false 
words.Add("drive");//true 

Для решения этой задачи мне нужно регулярное выражение, которое только не принимает письма (без специальных символов, не пробельные). Слова должны содержать не менее 4 символов без ограничений. И он должен принимать только заглавные буквы в начале строки. И здесь моя проблема.

Вот мой код:

var WordRegex = new Regex("^[a-zA-Z]{4,}$", RegexOptions.Compiled | RegexOptions.CultureInvariant); 
var secondRegex = new Regex("([A-Z]{1})"); 

foreach (var word in words) 
{ 
    if (WordRegex.IsMatch(word) && secondRegex.Matches(word).Count == 1) 
    { 
     finalList.Add(word); 
    } 
} 

У меня есть проблема в том, что слово «LOWERCASE» переходит в finallist, которые я не хочу. Я только хочу, чтобы он входил в finalList, если верхняя буква находится в начале строки.

Мое второе регулярное выражение предотвращает такие слова, как «McLaren», потому что у него есть две прописные буквы.

снова:

  • McLaren < --- не должны принимать (две прописные буквы)
  • Макларен < --- не должны принимать (заглавную букву "внутри" * строка)
  • Mclaren < --- следует принимать (заглавные буквы в начале)
  • Макларен < --- также не должны принимать (не прописные буквы)

* Что я имею в виду с внутри, если есть какие-либо прописные буквы не в начале или в конце.

previous version of my question дал только C# решения, и теперь я хочу иметь регулярное выражение с той же целью, чтобы учиться на нем.

+0

Вы можете использовать '^ [A-Z]', чтобы найти верхний регистр в начале строки. Или даже '@"^\ p {Lu} "' –

+3

Какая проблема с '^ [A-Za-z] [a-z] {3,} $'? – xanatos

+0

Почему вы отправляете этот вопрос дважды? Если предоставленные вами решения не помогли вам разобраться, почему они не сделали этого, а не снова отправили тот же вопрос. – HimBromBeere

ответ

1
^(?:[A-Z]|[a-z])[a-z]{3,}$ 

Вы можете использовать this.See демо.

https://regex101.com/r/eB8xU8/2

+1

Большое спасибо за ваш ответ! действительно ценю вашу помощь! –

+2

Вы знаете, что не просили принять ответ. Вы были здесь достаточно долго, чтобы это знать. –

+0

@PatrickHofman его не попрошайничает ... его вроде закрывает вопрос ...... логический конец вопроса .......... – vks

0

Вы можете принять этот Regex:

^[a-zA-Z][a-z]{3,} 
  • Первый ^ является начало строки
  • [a-zA-Z] матчи ровно одна буква, независимо от того, если прописных или строчных случае
  • [a-z]{3,} не менее трех строчных букв.
2

Это простое регулярное выражение должно сделать:

^[A-Za-z][a-z]{3,}$ 

Он терпит неудачу в любой заглавной буква после старта. Это позволяет, по крайней мере 4-х символов в общей сложности, так как первая часть соответствует ровно один символ, вторая часть, по крайней мере 3. Комбинированное оно соответствует, по крайней мере 4.

+0

Действительно - плохой нисходящий! :( – Nathan

+1

[Bullet point 2] (http://meta.stackexchange.com/q/17204) –

+0

@PatrickHofman пользуется вашей +8 репутацией: p –

3

Одно регулярное выражение достаточно:

^[A-Za-z][a-z]{3,}$ 
  • ^ обозначает начало текста,
  • следуют одна или прописные буквы в нижнем регистре,
  • следуют три или более строчные буквы
  • , за которым следует конец t ext ($), то есть никаких других букв после нижних регистров.
+0

большое спасибо за ваш ответ и объяснение –

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