如何提取括号(圆括号)之间的文本?

218 .net c# regex

我有一个字符串User name (sales),我想在括号之间提取文本,我该怎么做?

我怀疑子字符串,但我无法弄清楚如何阅读,直到结束括号,文本的长度会有所不同.

Dia*_*tis 425

一个非常简单的方法是使用正则表达式:

Regex.Match("User name (sales)", @"\(([^)]*)\)").Groups[1].Value
Run Code Online (Sandbox Code Playgroud)

作为对(非常有趣的)评论的回应,这里有相同的正则表达式,并有一些解释:

\(             # 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"
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢它,当人们说"一种简单的方法是使用正则表达式"然后提供相当于一串难以理解的象形文字时(当不同的人建议正则表达式时,它们特别有趣,并且每个人都会针对同一问题提出不同的象形文字集).:) (490认同)
  • 在堆栈上没有足够的答案实际上_解释正在发生的事情._谢谢你的精彩解释. (47认同)
  • @ rank1你必须逃避括号.@这里提供的是你不需要逃避反斜杠.所以没有@就像"\\\(([^]]*)\\\)". (10认同)

Jel*_*Ama 421

如果你想远离正则表达式,我能想到的最简单的方法是:

string input = "User name (sales)";
string output = input.Split('(', ')')[1];
Run Code Online (Sandbox Code Playgroud)

  • 老实说,这应该被选为答案. (88认同)
  • 如果你想使用相同的逻辑来选择多个:`var input ="(fdw)用户名(销售)safdsdf(再次?)"; var output = input.Split('(',')').其中((item,index)=> index%2!= 0).ToList();` (13认同)
  • 请注意,此解决方案还从包含 `)sales(`、`(sales(` 等) 的输入字符串中提取 `sales` (5认同)
  • 是不是进一步收缩成 input.Split("()".ToCharArray())[1] (2认同)

Ros*_*ard 91

假设你只有一对括号.

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

  • 如果你想要"销售"而不是(销售),则子串中的start + 1更正确 (7认同)

art*_*ker 24

使用此功能:

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));
    }
Run Code Online (Sandbox Code Playgroud)

这是用法:

GetSubstringByString("(", ")", "User name (sales)")
Run Code Online (Sandbox Code Playgroud)

输出将是:

sales
Run Code Online (Sandbox Code Playgroud)


Jen*_*fer 14

正则表达式可能是这里最好的工具.如果你不熟悉它们,我建议你安装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;
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*len 14

string input = "User name (sales)";

string output = input.Substring(input.IndexOf('(') + 1, input.IndexOf(')') - input.IndexOf('(') - 1);
Run Code Online (Sandbox Code Playgroud)

  • 您当然应该只计算第一个括号的位置一次。 (2认同)

chi*_*s42 13

一个正则表达式可能吗?我认为这会奏效......

\(([a-z]+?)\)
Run Code Online (Sandbox Code Playgroud)


小智 7

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;
}
Run Code Online (Sandbox Code Playgroud)


Gus*_*sta 6

int start = input.IndexOf("(") + 1;
int length = input.IndexOf(")") - start;
output = input.Substring(start, length);
Run Code Online (Sandbox Code Playgroud)