Как извлечь текст, который находится между круглыми скобками (круглые скобки)?

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

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

Ответ 1

Очень простой способ сделать это - использовать регулярные выражения:

Regex.Match("User name (sales)", @"\(([^)]*)\)").Groups[1].Value

Как ответ на (очень смешной) комментарий, здесь одно и то же Regex с некоторым объяснением:

\(             # Escaped parenthesis, means "starts with a '(' character"
    (          # Parentheses in a regex mean "put (capture) the stuff 
               #     in between into the Groups array" 
       [^)]    # Any character that is not a ')' character
       *       # Zero or more occurrences of the aforementioned "non ')' char"
    )          # Close the capturing group
\)             # "Ends with a ')' character"

Ответ 2

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

string input = "User name (sales)";
string output = input.Split('(', ')')[1];

Ответ 3

Предполагая, что у вас есть только одна пара скобок.

string s = "User name (sales)";
int start = s.IndexOf("(") + 1;
int end = s.IndexOf(")", start);
string result = s.Substring(start, end - start);

Ответ 4

Используйте эту функцию:

public string GetSubstringByString(string a, string b, string c)
    {
        return c.Substring((c.IndexOf(a) + a.Length), (c.IndexOf(b) - c.IndexOf(a) - a.Length));
    }

и вот использование:

GetSubstringByString("(", ")", "User name (sales)")

и выход будет:

sales

Ответ 5

Регулярные выражения могут быть лучшим инструментом здесь. Если вы не знакомы с ними, я рекомендую вам установить Expresso - отличный инструмент для регулярных выражений.

Что-то вроде:

Regex regex = new Regex("\\((?<TextInsideBrackets>\\w+)\\)");
string incomingValue = "Username (sales)";
string insideBrackets = null;
Match match = regex.Match(incomingValue);
if(match.Success)
{
    insideBrackets = match.Groups["TextInsideBrackets"].Value;
}

Ответ 6

Возможно, существует регулярное выражение? Я думаю, что это сработает...
\(([a-z]+?)\)

Ответ 7

string input = "User name (sales)";

string output = input.Substring(input.IndexOf('(') + 1, input.IndexOf(')') - input.IndexOf('(') - 1);

Ответ 8

using System;
using System.Text.RegularExpressions;

private IEnumerable<string> GetSubStrings(string input, string start, string end)
{
    Regex r = new Regex(Regex.Escape(start) +`"(.*?)"`  + Regex.Escape(end));
    MatchCollection matches = r.Matches(input);
    foreach (Match match in matches)
    yield return match.Groups[1].Value;
}

Ответ 9

Используйте регулярное выражение:

string test = "(test)"; 
string word = Regex.Match(test, @"\((\w+)\)").Groups[1].Value;
Console.WriteLine(word);

Ответ 10

input.Remove(input.IndexOf(')')).Substring(input.IndexOf('(') + 1);

Ответ 11

Метод regex превосходен, я думаю, но если вы хотите использовать скромный substring

string input= "my name is (Jayne C)";
int start = input.IndexOf("(");
int stop = input.IndexOf(")");
string output = input.Substring(start+1, stop - start - 1);

или

string input = "my name is (Jayne C)";
string output  = input.Substring(input.IndexOf("(") +1, input.IndexOf(")")- input.IndexOf("(")- 1);

Ответ 12

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

// 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)", "(", ")");

Ответ 13

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

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

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

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

 output = input.Substring(0, input.IndexOf(separator)); 

Ответ 14

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

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

Ответ 15

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

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;
}

Ответ 16

int start = input.IndexOf("(") + 1;
int length = input.IndexOf(")") - start;
output = input.Substring(start, length);

Ответ 17

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

public String getSubstring(String startChar, String endChar, String initString)
{
    return initString.substring((initString.indexOf(startChar) + 1), (initString.indexOf(endChar)));
}