Одно альтернативное (и наивное) решение, которое не требует регулярного выражения, должно было бы использовать метод String.Split и функцию List.Select
для map : сложное условие:
var text = @"i have the car which is very fast. me is slow.";
var length = 2;
var first = true; // first word in the sentence
var containsDot = false; // previous word contains a dot
var result = text
.Split(' ')
.ToList()
.Select (p =>
{
if (first)
{
p = FirstCharToUpper(p);
first = false;
}
if (containsDot)
{
p = FirstCharToUpper(p);
containsDot = false;
}
containsDot = p.Contains(".");
if (p.Length > length)
{
return FirstCharToUpper(p);
}
return p;
})
.Aggregate ((h, t) => h + " " + t);
Console.WriteLine(result);
Выход:
I Have The Car Which is Very Fast. Me is Slow.
Метод FirstCharToUpper
из этого SO post :
public static string FirstCharToUpper(string input)
{
if (String.IsNullOrEmpty(input))
throw new ArgumentException("ARGH!");
return input.First().ToString().ToUpper() + String.Join("", input.Skip(1));
}
Недостаток это решение: чем сложнее условие, тем более сложным / нечитаемым будет оператор select, но он является альтернативой регулярному выражению.