问答中心分类: REGEX如何提取位于括号(圆括号)之间的文本?
0
匿名用户 提问 3月 前

我有一根绳子User name (sales)我想提取括号之间的文本,我该怎么做?
我怀疑是子字符串,但直到右括号,我才知道如何阅读,文本的长度会有所不同。

18 Answers
0
Jelly Ama 回答 3月 前

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

string input = "User name (sales)";
string output = input.Split('(', ')')[1];
Pat Lindley 回复 3月 前

老实说,这应该被选为答案。

prabhakaran 回复 3月 前

它不是进一步压缩到输入中吗。拆分(“()”。ToCharArray())[1]

WtFudgE 回复 3月 前

如果你想使用相同的逻辑选择多个:var input = "(fdw) User name (sales) safdsdf (again?)"; var output = input.Split('(', ')').Where((item, index) => index % 2 != 0).ToList();

Stefano Spinucci 回复 3月 前

注意,此解决方案提取sales也来自包含)sales(,(sales(

Al-Hanash Moataz 回复 3月 前

简单答案,最佳答案+1

0
Diadistis 回答 3月 前

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

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

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

\(             # 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"
Deltics 回复 3月 前

我喜欢人们说“一种简单的方法是使用正则表达式”,然后提供相当于一串无法辨认的象形文字(当不同的人建议正则表达式,并且每个人针对同一个问题提出不同的象形文字集时,这尤其有趣。):)

Sandy Gifford 回复 3月 前

实际上,堆栈上没有足够的答案解释发生什么事。非常感谢。对于精彩的解释。

rank1 回复 3月 前

如果您在开始时使用“@”,我认为您不需要转义括号?

Diadistis 回复 3月 前

@rank1你必须跳出括号。这里@提供的是,你不需要逃避反斜杠。因此,如果没有@,它就像“\\([^]*)\\”。

Jan Van der Haegen 回复 3月 前

但这并不能很好地处理嵌套组。更改为var filterRegex = new Regex(Regex.Escape("(") + "([^()]*)" + Regex.Escape(")"));

MBH 回复 3月 前

谢谢(非常有趣)的评论,让我们得到这么好的解释。我不喜欢正则表达式,在这个解释之后,我会使用。谢谢你们俩提出的有益的论点@三角洲

v.oddou 回复 3月 前

嵌套括号怎么样

Harvey Darvey 回复 3月 前

让我尊敬数学家斯蒂芬·科尔·克莱恩,他是20世纪50年代提出正则表达式概念的人

koryakinp 回复 3月 前

@当字符串有多个括号条目时,它如何处理这种情况?User name (sales) or (dev)

Diadistis 回复 3月 前

@科里亚金普从文档中:在指定的输入字符串中搜索第一次发生正则表达式构造函数中指定的正则表达式。

0
Ross Goddard 回答 3月 前

假设只有一对括号。

string s = "User name (sales)";
int start = s.IndexOf("(") + 1;
int end = s.IndexOf(")", start);
string result = s.Substring(start, end - start);
Joze 回复 3月 前

如果您想要“sales”而不是(sales),则子字符串中的start+1更为正确

dotnetstep 回复 3月 前

将发生什么?

ChrisD 回复 3月 前

@dotnetstep你是对的应该是int end = s.IndexOf(")", start);。我已将编辑排队。。。

ave 回复 3月 前

“(”。Length;优于+1。发送了一个编辑。还添加了一个函数。

0
artfulhacker 回答 3月 前

使用此功能:

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
0
Jennifer 回答 3月 前

正则表达式可能是这里最好的工具。如果您不熟悉它们,我建议您安装(蒸汽加压煮出的)浓咖啡-一个很棒的小正则表达式工具。
类似于:

Regex regex = new Regex("\\((?\\w+)\\)");
string incomingValue = "Username (sales)";
string insideBrackets = null;
Match match = regex.Match(incomingValue);
if(match.Success)
{
    insideBrackets = match.Groups["TextInsideBrackets"].Value;
}
Denis Barzanov 回复 3月 前

正则表达式不支持嵌套