Как использовать 1 заглавную букву (игнорируя не a-z) с помощью регулярного выражения в c #? - PullRequest
2 голосов
/ 03 июня 2019

Существует множество сообщений о том, как сделать заглавными букву первую букву в C #, но я специально пытаюсь решить эту проблему, игнорируя префиксные буквенные символы и теги внутри них. Например,

<style=blah>capitalize the word, 'capitalize'</style>

Как игнорировать потенциальные <> теги (или непечатаемые символы перед ним, например звездочку *) и содержимое внутри них, ТО заглавными буквами "прописными буквами"?

Я пытался:

public static string CapitalizeFirstCharToUpperRegex(string str)
{
    // Check for empty string.  
    if (string.IsNullOrEmpty(str))
        return string.Empty;

    // Return char and concat substring. 
    // Start @ first char, no matter what (avoid <tags>, etc)
    string pattern = @"(^.*?)([a-z])(.+)";

    // Extract middle, then upper 1st char
    string middleUpperFirst = Regex.Replace(str, pattern, "$2");
    middleUpperFirst = CapitalizeFirstCharToUpper(str); // Works

    // Inject the middle back in
    string final = $"$1{middleUpperFirst}$3";
    return Regex.Replace(str, pattern, final);
}

РЕДАКТИРОВАТЬ:

Ввод: <style=foo>first non-tagged word 1st char upper</style>

Ожидаемый результат: <style=foo>First non-tagged word 1st char upper</style>

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Вы можете использовать

<[^<>]*>|(?<!\p{L})(\p{L})(\p{L}*)

Регулярное выражение выполняет следующие действия:

  • <[^<>]*> - соответствует <, любые 0+ символов кроме < и > и затем >
  • | - или
  • (?<!\p{L}) - находит позицию, которой непосредственно не предшествует буква
  • (\p{L}) - захватывает в группу1 любая буква
  • (\p{L}*) - вводит в группу 2 любые буквы 0+ (это необходимо, если вы хотите сделать остальную часть слова строчными.)

Затем проверьте,Группа 2 совпадает, и если да, используйте заглавную букву для первого значения группы и строчные буквы для второго, иначе верните все значение целиком:

var result = Regex.Replace(s, @"<[^<>]*>|(?<!\p{L})(\p{L})(\p{L}*)", m =>
                m.Groups[1].Success ? 
                  m.Groups[1].Value.ToUpper() + m.Groups[2].Value.ToLower() :
                  m.Value);

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

var result = Regex.Replace(s, @"<[^<>]*>|(?<!\p{L})(\p{L})", m =>
                m.Groups[1].Success ? 
                  m.Groups[1].Value.ToUpper() : m.Value);

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

var s = "<style=foo>first non-tagged word 1st char upper</style>";
var found = false;
var result = Regex.Replace(s, @"<[^<>]*>|(?<!\p{L})(\p{L})", m => {
            if (m.Groups[1].Success && !found) { 
                found = !found;
                return m.Groups[1].Value.ToUpper();
            } else {
                return m.Value;
            }
        });
Console.WriteLine(result); // => <style=foo>First non-tagged word 1st char upper</style>

См. Демоверсию C # .

1 голос
/ 03 июня 2019

Используя функцию регулярного выражения для поиска, вы можете сопоставить первую «заглавную букву» без> круглых скобок, а затем вы можете использовать заглавные буквы для вывода.
Регулярное выражение следующее:

(?<=<.*>)\w+

Это будет соответствоватьпервое слово после> круглых скобок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...