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

Тире (-), косая черта (/), двоеточие (:), точка (.), вопросительный знак (?), восклицательный знак (!), многоточие (... ИЛИ ...) (они разные)

Я как бы увяз в этой головоломке из-за всех специальных символов регулярных выражений, которые я пытаюсь буквально искать в своем поиске. Я считаю, что могу использовать Regex.Escape, хотя в этом случае я не могу заставить его работать для меня прямо сейчас.

Вот несколько примеров начальных строк, которые нужно изменить:

Change this:
This is a dash - example
To this:
This is a dash - Example       <--capitalize "Example" with Regex

This is another dash -example
This is another dash -Example

This is an ellipsis ... example
This is an ellipsis ... Example

This is another ellipsis …example
This is another ellipsis …Example

This is a slash / example
This is a slash / Example

This is a question mark ? example
This is a question mark ? Example

Вот код, который у меня есть:

private static string[] postCaps = { "-", "/", ":", "?", "!", "...", "…"};
private static string ReplacePostCaps(string strString)
{

    foreach (string postCap in postCaps)
    {

        strString = Regex.Replace(strString, Regex.Escape(postCap), "/(?<=(" + Regex.Escape(postCap) + "))./", RegexOptions.IgnoreCase);   

    }
    return strString;

}

Большое спасибо!

0
RandyWhirl 7 Янв 2014 в 19:54

2 ответа

Лучший ответ

Вам не нужно перебирать список знаков препинания, вместо этого можно просто добавить набор символов в одно регулярное выражение:

(?:[/:?!…-]|\.\.\.)\s*([a-z])

Чтобы использовать его с Regex.Replace():

strString = Regex.Replace(
    strString,
    @"(?:[/:?!…-]|\.\.\.)\s*([a-z])",
    m => m.ToString().ToUpper()
);

Regex объяснил:

(?:                 # non-capture set
    [/:?!…-]        # match any of these characters
    | \.\.\.        # *or* match three `.` characters in a row
)
\s*                 # allow any whitespace between matched character and letter
([a-z])             # match, and capture, a single lowercase character
4
newfurniturey 7 Янв 2014 в 16:25

Может быть, это сработает для вас:

var phrase = "This is another dash ... example";
var rx = new System.Text.RegularExpressions.Regex(@"(?<=[\-./:?!]) *\w");
var newString = rx.Replace(phrase, new System.Text.RegularExpressions.MatchEvaluator(m => m.Value.ToUpperInvariant()));
1
TomB 7 Янв 2014 в 16:38