none
Регулярные выражения. Разделить по сдвоенным заглавным RRS feed

  • Вопрос

  • Здравствуйте!

    Проблема возникла при разделении строки по заглавным буквам. Строка приходит в так называемой "верблюжьей нотации" (к примеру FirstName

    Использую вот такое решение

    Regex.Replace(value, "([a-z])([A-Z])", "$1 $2");

    В данном случае из сроки FirstName получится First Name. Все как надо, но бываю строки, к примеру IDorFirstNumber.

    Необходимо чтобы получилось ID or First Number, а получается IDor First Number. То есть если с строке есть две заглавные буквы подряд, то результат будет не верным. 

    Помогите пожалуйста в решении данной проблемы?

    Спасибо!


    • Изменено Alexey110 4 июня 2014 г. 6:49

Ответы

  • "чтобы если в слове первые две буквы - заглавные, то их отделить от других, а остальные разделять просто по первой заглавной букве - вот и все." - примерно так:

    namespace ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                var regex = new Regex("([A-Z]+[a-z]+)");
                string result = regex.Replace("IDorFirstNumber", m =>
                {
                    if (m.Length > 2)
                    {
                        if (Regex.IsMatch(m.Value, "^[A-Z]{2}"))
                        {
                            return m.Value.Substring(0, 2) + " " + m.Value.Substring(2) + " ";
                        }
                    }
    
                    return m.Value + " ";
                }
                );
            }
        }
    }


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Alexey110 5 июня 2014 г. 6:51
    Модератор

Все ответы

  • Добрый день.

    Вы неправильно формулируете задачу или исходные данные. Исходя из строки IDorFirstNumber, по вашему описанию должно получится: I Dor First Number. Для того, чтобы получилось Id Or First Number, входная строка должна иметь вид: IdOrFirstNumber

    Отвечающий
  • Да, Вы совершенно правы, но эти данные не я формирую - они приходят мне по сети и повлиять на их изменения не могу. А писать их клиенту в таком виде не очень хорошо!

    Строка приходит именно в таком формате IDorFirstNumber и я хочу попробовать выделить ID из этого выражения. Это можно сделать в ручную, но могут быть и другие данные похожие на эти. Для этого я и хочу сделать шаблон для разбора строки.

  • Еще раз, у вас входная строка не подпадает под ваши правила, слово Or начинается с маленькой буквы. Вы тогда либо другие правила формируйте (и в этом мы вам помочь не сможем, т.к. у нас нет исходных данных с примерами разбираемых строк) или общайтесь с поставщиком данных, чтобы он не нарушал установленные договоренности, или пишите парсер уже понятных правил и в случае новых ситуаций его дописывайте...

    Отвечающий
  • Все ситуации конечно не предусмотришь, но я всего лишь хочу, чтобы если в слове первые две буквы - заглавные, то их отделить от других, а остальные разделять просто по первой заглавной букве - вот и все. Раньше не очень часто сталкивался с рег. выражениями, а вот сейчас пришлось читать мануал MSDN и пока, что не нашел ответа.
  • "чтобы если в слове первые две буквы - заглавные, то их отделить от других, а остальные разделять просто по первой заглавной букве - вот и все." - примерно так:

    namespace ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                var regex = new Regex("([A-Z]+[a-z]+)");
                string result = regex.Replace("IDorFirstNumber", m =>
                {
                    if (m.Length > 2)
                    {
                        if (Regex.IsMatch(m.Value, "^[A-Z]{2}"))
                        {
                            return m.Value.Substring(0, 2) + " " + m.Value.Substring(2) + " ";
                        }
                    }
    
                    return m.Value + " ";
                }
                );
            }
        }
    }


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Alexey110 5 июня 2014 г. 6:51
    Модератор
  • Спасибо большое!!!!