Как извлечь текст из круглых скобок? - PullRequest
207 голосов
/ 18 декабря 2008

У меня есть строка User name (sales), и я хочу извлечь текст в скобках, как мне это сделать?

Я подозреваю, что подстрока, но я не могу понять, как читать до закрывающей скобки, длина текста будет варьироваться.

Ответы [ 16 ]

2 голосов
/ 18 декабря 2008
input.Remove(input.IndexOf(')')).Substring(input.IndexOf('(') + 1);
1 голос
/ 20 июля 2017
int start = input.IndexOf("(") + 1;
int length = input.IndexOf(")") - start;
output = input.Substring(start, length);
1 голос
/ 06 февраля 2015

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

Не уклоняйтесь от них, потому что синтаксис трудно понять. Они могут быть такими сильными.

0 голосов
/ 18 февраля 2015

Этот код работает быстрее, чем большинство решений (если не все), упакован как Строка метод расширения , он не поддерживает рекурсивное вложение:

public static string GetNestedString(this string str, char start, char end)
{
    int s = -1;
    int i = -1;
    while (++i < str.Length)
        if (str[i] == start)
        {
            s = i;
            break;
        }
    int e = -1;
    while(++i < str.Length)
        if (str[i] == end)
        {
            e = i;
            break;
        }
    if (e > s)
        return str.Substring(s + 1, e - s - 1);
    return null;
}

Это немного длиннее и медленнее, но лучше обрабатывает рекурсивное вложение:

public static string GetNestedString(this string str, char start, char end)
{
    int s = -1;
    int i = -1;
    while (++i < str.Length)
        if (str[i] == start)
        {
            s = i;
            break;
        }
    int e = -1;
    int depth = 0;
    while (++i < str.Length)
        if (str[i] == end)
        {
            e = i;
            if (depth == 0)
                break;
            else
                --depth;
        }
        else if (str[i] == start)
            ++depth;
    if (e > s)
        return str.Substring(s + 1, e - s - 1);
    return null;
}
0 голосов
/ 27 ноября 2014

Я сталкивался с этим, когда искал решение для очень похожей реализации.

Вот фрагмент моего кода. Начинает подстроку с первого символа (индекс 0).

 string separator = "\n";     //line terminator

 string output;
 string input= "HowAreYou?\nLets go there!";

 output = input.Substring(0, input.IndexOf(separator)); 
0 голосов
/ 26 ноября 2014

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

// Returns the text between 'start' and 'end'.
string ExtractBetween(string text, string start, string end)
{
  int iStart = text.IndexOf(start);
  iStart = (iStart == -1) ? 0 : iStart + start.Length;
  int iEnd = text.LastIndexOf(end);
  if(iEnd == -1)
  {
    iEnd = text.Length;
  }
  int len = iEnd - iStart;

  return text.Substring(iStart, len);
}

Чтобы назвать это в вашем конкретном примере, вы можете сделать:

string result = ExtractBetween("User name (sales)", "(", ")");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...