算术运算表达式正则及分析
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>
相关链接:http://topic.csdn.net/t/20051227/16/4484337.html
Regex regex = new Regex(@"
^ (?#匹配开头)
[-+]? (?#开头可以出现正负号)
([0-9]+($|[-+*/]))* (?#可选数-符号-数-符号-……-数-符号或结尾)
(
(
(?<o>\() (?#左括号,保存到o名字下)
[-+]? (?#可选正负号)
([0-9]+[-+*/])* (?#可选数-符-数-符……)
)+ (?#可以重复出现左括号)
[0-9]+ (?#左右括号之间最起码需要一个操作数)
(
(?<-o>\)) (?#右括号,匹配的同时去掉一个左括号)
([-+*/][0-9]+)* (?#可选符-数-符-数……)
)+ (?#可以重复出现右括号,仅当还有左括号剩余)
($|[-+*/]) (?#要么结尾,要么在下一个左括号出现之前出现一个运算符)
)* (?#重复出现左括号)
(?(o)(?!)) (?#如果还有左括号剩余就不匹配任何东西)
(?<=[0-9)]) (?#检查结尾前是否数字或右括号)
$ (?#匹配结尾)
", RegexOptions.IgnorePatternWhitespace);
string[] tests = new string[] {
"1",
"1+23",
"1+23*456",
"1*(23+456)",
"(3)",
"((67+8)*9+10)/11",
"12+(13*)",
"()",
"((3)",
"(3))",
"+3",
"5*(4+3/(-2))",
"(5*(4+3/(-2))",
"5*(4+3/(-2)))",
"+3*",
"+(4)+(-5)",
"+(4)(5)",
};
foreach (string s in tests)
Console.WriteLine("{0}: {1}", regex.IsMatch(s) ? "Good" : " Bad", s);
Console.ReadKey();
完整正则应为:^[-+]?([0-9]+($|[-+*/]))*(((?<o>\()[-+]?([0-9]+[-+*/])*)+[0-9]+((?<-o>\))([-+*/][0-9]+)*)+($|[-+*/]))*(?(o)(?!))(?<=[0-9)])$
Regex regex = new Regex(@"
^ (?#匹配开头)
[-+]? (?#开头可以出现正负号)
([0-9]+($|[-+*/]))* (?#可选数-符号-数-符号-……-数-符号或结尾)
(
(
(?<o>\() (?#左括号,保存到o名字下)
[-+]? (?#可选正负号)
([0-9]+[-+*/])* (?#可选数-符-数-符……)
)+ (?#可以重复出现左括号)
[0-9]+ (?#左右括号之间最起码需要一个操作数)
(
(?<-o>\)) (?#右括号,匹配的同时去掉一个左括号)
([-+*/][0-9]+)* (?#可选符-数-符-数……)
)+ (?#可以重复出现右括号,仅当还有左括号剩余)
($|[-+*/]) (?#要么结尾,要么在下一个左括号出现之前出现一个运算符)
)* (?#重复出现左括号)
(?(o)(?!)) (?#如果还有左括号剩余就不匹配任何东西)
(?<=[0-9)]) (?#检查结尾前是否数字或右括号)
$ (?#匹配结尾)
", RegexOptions.IgnorePatternWhitespace);
string[] tests = new string[] {
"1",
"1+23",
"1+23*456",
"1*(23+456)",
"(3)",
"((67+8)*9+10)/11",
"12+(13*)",
"()",
"((3)",
"(3))",
"+3",
"5*(4+3/(-2))",
"(5*(4+3/(-2))",
"5*(4+3/(-2)))",
"+3*",
"+(4)+(-5)",
"+(4)(5)",
};
foreach (string s in tests)
Console.WriteLine("{0}: {1}", regex.IsMatch(s) ? "Good" : " Bad", s);
Console.ReadKey();
完整正则应为:^[-+]?([0-9]+($|[-+*/]))*(((?<o>\()[-+]?([0-9]+[-+*/])*)+[0-9]+((?<-o>\))([-+*/][0-9]+)*)+($|[-+*/]))*(?(o)(?!))(?<=[0-9)])$