波斯马BOSSMA Information Technology

c#匹配括号对的算法

发布时间:2010年6月29日 / 分类:DOTNET / 268,092 次浏览 / 评论

这个东西本来是用于解析sql语句的,写出来之后感觉很多地方都可能用到,可能不是很符合你的要求,使用的时候需要注意。

这个方法用于匹配成对出现的括号,获取括号中的内容。

//获取配对括号中的内容
public List GetBracketList(string strIn)
{
List list2 = null;
List list = new List();
bool isStartValue = false;
int i = 0;

//将所有的括号按照前后顺序找出来,放到一个List里边
foreach (char str in strIn)
{
//如果遇到单引号,则不添加到List,除非单引号成对出现以后
if (str.ToString() == "'")
{
isStartValue = !isStartValue;
}

if (str.ToString() == "(" || str.ToString() == ")")
{
//单引号成对出现之后,才允许添加到list
if (!isStartValue)
{
list.Add(new SQLBracket(str.ToString(), i));
}
}

i++;
}

//如果左、右括号不是成对出现的,返回null
if (list.Count % 2 != 0)
{
return null;
}

//获取左、右括号对
list2 = new List();
if (list.Count > 0)
{
//使用一个双遍历,首先获取左括号,然后查找右括号
for (int k = 0; k < list.Count; k++)
{
//如果是左括号
if (list[k].Code == "(")
{
//考虑到括号嵌套的可能性,需要计算配对括号之间还有多少括号需要配对
int distanceleft = 0;
int distanceRight = 0;

for (int j = k + 1; j < list.Count; j++)
{
//如果在左括号之后发现右括号之前又发现左括号,计数
if (list[j].Code == "(")
{
distanceleft++;
}

//如果发现右括号
if (list[j].Code == ")")
{
//检查右括号是否和左括号级次相等,如相等将左括号和右括号添加到配对表中,并跳出查找右括号的循环
if (distanceRight == distanceleft)
{
list2.Add(new SQLBracketPair(list[k], list[j], strIn.Substring(list[k].Index + 1, list[j].Index - list[k].Index - 1)));
break;
}
//如果还不是匹配的右括号,计数
distanceRight++;
}
}
}
}
}

return list2;
}

///
/// 定义一个括号
///
public class SQLBracket
{
public SQLBracket(string code, int index)
{
Code = code;
Index = index;
}

public string Code { get; set; }
public int Index { get; set; }
}

///
/// 定义一个括号对
///
public class SQLBracketPair
{
public SQLBracketPair(SQLBracket leftBracket, SQLBracket rightBracket, string include)
{
LeftBracket = leftBracket;
RightBracket = rightBracket;
Include = include;
}

public SQLBracket LeftBracket { get; set; }
public SQLBracket RightBracket { get; set; }
public string Include { get; set; }
}
本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《c#匹配括号对的算法

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论