正则表达式在括号中提取字符串,括号中还包含其他括号

时间:2018-01-09 19:45:02

标签: c# regex string perl

我一直试图解决这个问题,但我认为我不能理解Regex到达我需要的位置。

我的字符串类似于:

filename.txt(1)attribute, 2)attribute(s), more!)
otherfile.txt(abc, def)

基本上,一个始终以文件名开头的字符串,然后在括号之间有一些文本。而我正在尝试提取主括号之间的那部分,但是那里的文本可以包含绝对任何东西,甚至更多的括号(它经常会这样做。)

最初,有一个像这样的'hacky'表达:

/\(([^@]+)\)\g

它有效,直到我们遇到输入字符串包含@并且我们被卡住的情况。显然...

我无法改变字符串的生成方式,它总是一个文件名,然后是一些括号和内部未知长度和内容的东西。

我希望有一个简单的Regex表达式,因为我需要在C#和Perl中工作 - 这样的事情可能吗?或者这需要更复杂的东西,比如它自己的解析方法?

2 个答案:

答案 0 :(得分:2)

您可以在正则表达式中将@符号的异常更改为正则表达式匹配任何字符,并添加从0到无穷大符号匹配的量词。并通过删除组构造简化您的正则表达式:

\(.*\)

以下是正则表达式的解释:

  • 符号\(字面匹配字符(
  • .*匹配任何字符(行终止符除外)
  • *量词在零和无限次之间匹配,多次 尽可能根据需要回馈(贪婪)
  • \)字面匹配字符)

您可以使用regex101撰写和调试正则表达式。

答案 1 :(得分:0)

在这种情况下,正则表达式对我来说似乎有些过分。使用string操作方法可以更可靠地实现。

int first = str.IndexOf("(");
int last = str.LastIndexOf(")");
if (first != -1 && last != -1)
{
    string subString = str.Substring(first + 1, last - first - 1);
}

我从未使用过Perl,但我猜想它有相同的方法。