我一直试图解决这个问题,但我认为我不能理解Regex到达我需要的位置。
我的字符串类似于:
filename.txt(1)attribute, 2)attribute(s), more!)
otherfile.txt(abc, def)
基本上,一个始终以文件名开头的字符串,然后在括号之间有一些文本。而我正在尝试提取主括号之间的那部分,但是那里的文本可以包含绝对任何东西,甚至更多的括号(它经常会这样做。)
最初,有一个像这样的'hacky'表达:
/\(([^@]+)\)\g
它有效,直到我们遇到输入字符串包含@并且我们被卡住的情况。显然...
我无法改变字符串的生成方式,它总是一个文件名,然后是一些括号和内部未知长度和内容的东西。
我希望有一个简单的Regex表达式,因为我需要在C#和Perl中工作 - 这样的事情可能吗?或者这需要更复杂的东西,比如它自己的解析方法?
答案 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,但我猜想它有相同的方法。