C#正则表达式匹配括号内的任何内容

20
我想匹配括号内的任何内容,但结果必须排除括号本身。
示例: Initialize(P90W) Brake(45X)
结果: 990W 45X
注意结果不含括号。
我一直在尝试让它工作,但没有成功。我尝试了几个变体,但我知道我错过了一个简单的东西,我不想使用Replace来实现它。
var item = "Brake(45X)"
Regex searchTerm = new Regex(@"\((.*)\)");
var value = (searchTerm.Match(item).Groups.Count > 0) ?
    searchTerm.Match(item).Groups[0].Value : string.Empty;

我不懂C#,但是new Regex()被认为是基本的、扩展的还是PREG?你尝试过切换用反斜杠转义的括号集吗?也许\(表示“标记范围的开始”,而(则是一个字面上的括号? - ghoti
这对我来说看起来很好,发生了什么?“value”是“string.Empty”吗? - Sean Bright
值以括号形式返回(P90W)或(45X)。 - Michael D. Irizarry
5个回答

42

有些人指责我总是使用零宽断言:

resultString = Regex.Match(subjectString, @"(?<=\().+?(?=\))").Value;

但它们确切地实现了你想要的功能。不要捕获你不想捕获的内容。


6
为什么需要前后查找?@"(([^)]*))"更简单,且长度缩短了4个字符 :) - kol
这很棒,kol的评论也很好,但我要说FailedDev的答案教会了我一些以前不知道的东西。 - Feign
十年后,但是根据@kol的评论,你需要使用Regex.Match(...).Groups[1],而这在@FailedDev的答案中并不适用。 - zg303

12

尝试正则表达式 @"\((.*?)\)"

编辑:结果将是第一组而不是第零组,第零组应包含整个正则表达式的结果而不是第一个括号内的值。


太有用了!我需要找到花括号内的所有字符串部分,所以使用了这段简单的代码: string pattern = @"{(.*?)}"; MatchCollection matches = Regex.Matches(text, pattern); - Stefano

3
删除内部括号并重试:
new Regex(@"(\([^\)]+\))");

如果在正则表达式中没有转义括号,且使用组匹配,则匹配结果只会返回括号内的内容。因此,如果有以下正则表达式:new Regex(@'(a)(b))',匹配 1 的结果将是 a,匹配 2 的结果将是 b。而匹配 0 则代表整个匹配结果。


一个注释,如果你想要清空括号:(([^)]*)) - Dani

0

试试这个:

var pattern = @".*public.*(.*\(.*\))";
Regex.Matches(input,pattern)

0
Regex searchTerm = new Regex(@"\(([^\)]*)\)");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接