日期:2014-05-20  浏览次数:20871 次

请高手指点一下:一个递归式的正则表达式的写法
请高手指点一下    
 
TotalSpot*(TotalSpot*(TotalSpot*(MediaUnitCost*(1-MediaNegotiationDiscount)*(1-OtherMediaDiscount)*(1-Agency     Discount)*(1+MediaNegotiationLoading)*(1+OtherMediaLoading))))    
 
怎么样写出一个匹配递归式的正则表达式    
 
要求:    
匹配所有括号里面的内容,    
如:(1+MediaNegotiationLoading),    
(MediaUnitCost*(1-MediaNegotiationDiscount)*(1-OtherMediaDiscount)*(1-Agency     Discount)*(1+MediaNegotiationLoading)*(1+OtherMediaLoading)),    
(TotalSpot*(MediaUnitCost*(1-MediaNegotiationDiscount)*(1-OtherMediaDiscount)*(1-Agency     Discount)*(1+MediaNegotiationLoading)*(1+OtherMediaLoading))),    
(TotalSpot*(TotalSpot*(MediaUnitCost*(1-MediaNegotiationDiscount)*(1-OtherMediaDiscount)*(1-Agency     Discount)*(1+MediaNegotiationLoading)*(1+OtherMediaLoading))))    
 
等.....

------解决方案--------------------
兄弟,我给你取出来了,虽然方法有点那个~恶,便毕竟是取出来了,下面是我的测试代码,你试下吧,至于里面方法有更简洁的你自己处理一下吧,还有,我没有存数组,这个应该就不难了吧,唉,一个多小时的青春啊

string yourStr=richTextBox1.Text ; //你的源字符串
MatchCollection mc = Regex.Matches(yourStr,@ "\([^\(\)]+?\) ",RegexOptions.IgnoreCase); //这个是用来取单一配对括号里的内容
foreach(Match m in mc)
{
richTextBox2.Text += m.Groups[0].Value+ "\n "; //这是提取内容
}
string start = " "; //下面为取多重括号内的内容
string end = " ";
int len = Regex.Replace(yourStr, ".*(? <!\\))(.*)$ ", "$1 ", RegexOptions.IgnoreCase).Length; //这个是取最后“)”的数量,应该是有更好的方法,反正我是一起用正则了
for(int i=1;i <len;i++)
{
Match m = Regex.Match(yourStr, start+@ "\(([^\(\)]+?\([^\(\)]+?\))+?\) "+end, RegexOptions.IgnoreCase);
richTextBox2.Text += m.Groups[0].Value+ "\n "; //这是提取内容
start +=@ "\([^\(\)]+? ";
end += @ "\) ";
}
------解决方案--------------------
string a= "(TotalSpot*(TotalSpot*(MediaUnitCost*(1-MediaNegotiationDiscount)*(1-OtherMediaDiscount)*(1-Agency Discount)*(1+MediaNegotiationLoading)*(1+OtherMediaLoading)))) ";
int iCount=a.Length;
ArrayList aList=new ArrayList();
for(int i=0;i <iCount;i++)
{
if(a[i].Equals( '( '))
{
int iB=1,iE=0,j=0;
for(j=i+1;j <iCount;j++)
{
if(a[j].Equals( '( '))
iB++;
if(a[j].Equals( ') '))
iE++;
if(iB==iE)
break;
}
aList.Add(a.Substring(i,j-i+1));
}
}
string[] sTemps=(string[])aList.ToArray(typeof(string));//转数组,用aList可不转
//不要意思,昨天开会,没来的急回你 这样简单处理就可以了,而且比正则的效率高出很多
//应该能适应所有情况