Удалить разделитель с помощью C # - PullRequest
1 голос
/ 30 июля 2010

У меня есть следующая строка:

{a{b,c}d}

если я даю 1, строка должна отображаться как:

{a d} 

содержимое во внутренних скобках должно быть удалено вместе сбрекеты.

Может ли кто-нибудь помочь мне с этим?

Ответы [ 3 ]

5 голосов
/ 30 июля 2010

Для извлечения внутренней группировки {} используйте следующее регулярное выражение:

string extract = Regex.Replace(source, "\{\w(\{\w,\w\})\w\}", "$1");

На самом деле, если вы хотите удалить запятую ....

string extract = Regex.Replace(source, "\{\w\{(\w),(\w)\}\w\}", "{$1 $2}");

Для извлечения внешнего без внутренней группировки:

string extract = Regex.Replace(source, "(\{\w)\{\w,\w\}(\w\})", "$1 $2");

если в вашем примере a, b, c, d не являются буквально одиночными символами, то есть группами букв или даже пробелов и т. Д., Замените \ w на \ w + или . *

на основании вашего комментария о вложенности ....

string extract = Regex.Replace(source, "(\{\w)\{.*\}(\w\})\w*", "$1 $2");
1 голос
/ 30 июля 2010

иди на регулярное выражение выше ... это действительно красивее!


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

     string def = "1+2*(3/(4+5))*2";
     int pcnt = 0, start = -1, end = -1;
     bool subEx = false;
     if(def.Contains("(") || def.Contains(")"))
        for(int i = 0; i < def.Length; i++) {
           if(def[i] == '(') {
              pcnt++;
              if(!subEx)
                 start = i;
           } else if(def[i] == ')')
              pcnt--;
           if(pcnt < 0)
              throw new Exception("negative paranthesis count...");
           if(pcnt != 0)
              subEx = true;
           if(subEx && pcnt == 0 && end == -1)
              end = i;
        }
     if(pcnt != 0) {
        throw new Exception("paranthesis doesn't match...");
     }
     if(subEx) {
        string firstPart = def.Substring(0, start);
        string innerPart = def.Substring(start + 1, end - (start + 1));
        string secondPart = def.Substring(end + 1);
        Console.WriteLine(firstPart);
        Console.WriteLine(innerPart);
        Console.WriteLine(secondPart);
     }

пишет:

1+2*
3/(4+5)
*2
0 голосов
/ 03 августа 2010

разделитель пространства имен { Программа класса { static void Main (строка [] args) { строка src = "a {b {c {d, e} f} g} h"; int occurenceCount = 0; foreach (char ch в src) { если (ch == '{') { occurenceCount ++; } } Console.WriteLine («Введите номер, чтобы удалить блок:»); int GivenValue = 0; CheckValid (из данного значения);

        int removeCount = occurenceCount + 1 - givenValue;
        occurenceCount = 0;
        int startPos = 0;
        for (int i = 0; i < src.Length; i++)
        {
            if (src[i] == '{')
            {
                occurenceCount++;
            }   
            if(occurenceCount == removeCount)
            {
                startPos = i;
                break;
                //i value { of to be removed block
            }
        }
        int endPos = src.IndexOf('}', startPos);
        src = src.Remove(startPos,endPos);

        //index of }
        Console.WriteLine("after reved vale:" + src);
        Console.ReadKey();
    }

    public static void CheckValid(out int givenValue)
    {
        if (!int.TryParse(Console.ReadLine(), out givenValue))
        {
            Console.WriteLine("Enter a valid no. to remove block: ");
            CheckValid(out givenValue);
        }
    }
}

}

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