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

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

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

Ответы [ 16 ]

408 голосов
/ 18 декабря 2008

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

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"
398 голосов
/ 27 августа 2011

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

string input = "User name (sales)";
string output = input.Split('(', ')')[1];
92 голосов
/ 18 декабря 2008

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

string s = "User name (sales)";
int start = s.IndexOf("(") + 1;
int end = s.IndexOf(")", start);
string result = s.Substring(start, end - start);
24 голосов
/ 28 января 2011

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

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
14 голосов
/ 18 декабря 2008

Регулярные выражения могут быть лучшим инструментом здесь. Если вы не знакомы с ними, я рекомендую вам установить 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;
}
13 голосов
/ 18 декабря 2008
string input = "User name (sales)";

string output = input.Substring(input.IndexOf('(') + 1, input.IndexOf(')') - input.IndexOf('(') - 1);
13 голосов
/ 18 декабря 2008

Может быть, регулярное выражение? Я думаю, что это будет работать ...

\(([a-z]+?)\)
7 голосов
/ 28 января 2013
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;
}
4 голосов
/ 18 декабря 2008

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

string test = "(test)"; 
string word = Regex.Match(test, @"\((\w+)\)").Groups[1].Value;
Console.WriteLine(word);
2 голосов
/ 18 декабря 2008

Я думаю, что метод 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...