我有一个这样的问题:
判定表达式的类型,类型分为下面几种类型
A&B , A>B, A|B例如给出如下的表达式:(P(X014,X016,AC5)&(HSB(X013,X014)|(HRB(X015,X016)))>P(X013,X015,AC1)用正则表达式能判定出是那种类型的吗,怎么写?谢谢!!!
判定表达式的类型,类型分为下面几种类型
A&B , A>B, A|B例如给出如下的表达式:(P(X014,X016,AC5)&(HSB(X013,X014)|(HRB(X015,X016)))>P(X013,X015,AC1)用正则表达式能判定出是那种类型的吗,怎么写?谢谢!!!
解决方案 »
- 卡巴斯基互联网安全套装使 c# sql2000 SqlClient 程序不能运行, 的问题, 卡巴使connection停止
- 这两句有没有区别?
- 我问个问题,大家帮个忙.......................
- 套接字小程序
- 如何使的TREEVIEW的某个节点处于默认选择状态
- 无法加载 DLL“Sa7134Capture.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。
- 如何把INI文件转换位XML格式的文件?
- 关于遍历目录的问题
- c#运行问题!!!
- 遗弃Java和C#,intel拥抱“IT语言”
- 有谁用过微软的RS232串口类CommBase.dll开发过串口通信程序?
- 新手求助
这个表达式判断结果应该是为A>B类型的.
using System.Text.RegularExpressions;
class MainClass
{ static void Main()
{
string inStr = @"(P(X014,X016,AC5)&(HSB(X013,X014)|(HRB(X015,X016)))>P(X013,X015,AC1)";
Regex myReg = new Regex(@"(?<num1>(.*))(?<op>[>|&])(?<num2>(.*))");
Match m = myReg.Match(inStr);
string op = m.Groups["op"].Value;
string num1 = m.Groups["num1"].Value;
string num2 = m.Groups["num2"].Value;
Console.WriteLine(op);
Console.WriteLine(num1);
Console.WriteLine(num2);
Console.ReadLine();
}
}
(?<name>)的分组方式,,就是对分组的部分进行了命名,这样就可以通过该组的命名来获取信息;
构造一个名为num1的分组,匹配0个或多个所有的字符
P(X013,X015,AC1)>(P(X014,X016,AC5)&(HSB(X013,X014)|(HRB(X015,X016)))
用上面的方法得到的是
num1 = P(X013,X015,AC1)>(P(X014,X016,AC5)&(HSB(X013,X014)
num2 = (HRB(X015,X016)))
op = |
这样是不对的啊,看来上面的方法还是有点问题,继续请教
using System.Text.RegularExpressions;
class MainClass
{ static void Main()
{
string inStr = @"P(X013,X015,AC1)>(P(X014,X016,AC5)&(HSB(X013,X014)|(HRB(X015,X016))))";
PrintExtraction(inStr, 0);
Console.ReadLine();
} static void PrintExtraction(string expression, int level)
{
string indent = new string(' ', level);
string num1, op, num2;
if (Extract(expression, out num1, out op, out num2))
{
if (op == string.Empty)
{
Console.WriteLine(indent + num1);
}
else
{
PrintExtraction(num1, level + 1);
Console.WriteLine(indent + op);
PrintExtraction(num2, level + 1);
}
}
else
{
Console.WriteLine(indent + "Cannot Match!!");
}
} static bool Extract(string expression, out string num1, out string op, out string num2)
{
num1 = op = num2 = string.Empty;
Regex regex = new Regex(@"
^
(?<lead>\()*
(?<num1>
[^>|&(]*?
(
(
(?<open>\()
[^()]*
)+
(
(?<-open>\))
[^()]*?
)+
)*
(?(open)(?!))
)
(
(?<op>[>|&])
(?<num2>
[^(]*
(
(
(?<open>\()
[^()]*
)+
(
(?<-open>\))
[^()]*
)+
)*
(?(open)(?!))
)
)?
(?<-lead>\))*
(?(lead)(?!))
$
", RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture);
Match match = regex.Match(expression);
if (match.Success)
{
num1 = match.Groups["num1"].Value;
if (match.Groups["op"].Success)
{
op = match.Groups["op"].Value;
num2 = match.Groups["num2"].Value;
}
return true;
}
else
{
return false;
}
}
}那个正则表达式我就懒得加注释了,可参考: http://community.csdn.net/Expert/TopicView.asp?id=4484337PrintExtraction 是个递归方法,一直解构表达式到不能结构为止。Extract 是真正的正则测试方法,如果成功则返回true,不成功则返回false当返回true的时候,输出参数num1, op, num2包含解构之后的左操作数、操作符、右操作数。如果当前表达式是独立表达式,则 op = num2 = 空。此外——你上面的回复那个表达式最后漏了个右括号,害我调试了良久
[^>|&(]*?
问号可以去掉。
using System.Collections;
class MainClass
{ static void Main()
{
string inStr = "P(X013, X015, AC1) > (P(X014, X016, AC5) & (HSB(X013, X014) | (HRB(X015, X016))));";
inStr = inStr.Replace(" ", "");
int pos = 0;
int opPos = 0;
bool flag = false;
Stack bras = new Stack();
while (true)
{
if (inStr[pos] == '(')
{
bras.Push('(');
flag = true;
}
if (inStr[pos] == ')')
{
bras.Pop();
}
pos++;
if (flag && bras.Count == 0)
{
opPos = pos;
break;
} }
string op = inStr[opPos].ToString();
string num1 = inStr.Substring(0, opPos);
string num2 = inStr.Substring(opPos+1, inStr.Length - opPos-1);
Console.WriteLine(op);
Console.WriteLine(num1);
Console.WriteLine(num2);
Console.ReadLine();
}
}
如下的表达式
string inStr = @"(P(X013,X015,AC1)>P(X014,X016,AC5))&(HSB(X013,X014)|HRB(X015,X016))";想得到的输出结果是&类型的,
现在输出的不是,我正在看你的代码,你有空的话看看是怎么回事?多谢
我想用正则表达式应该方便一些吧,具体的我对正则表达式还不了解,不知道这样是不是能很方便的解决,
我想问一下,正则表达式中有没有嵌套的用法,因为我要解决的也就是表达式嵌套的问题,
例如如下:
string inStr = @"(P(X013,X015,AC1)>P(X014,X016,AC5))&(HSB(X013,X014)|HRB(X015,X016))";
应该输出为&类型,我不知道用正则表达式能解决类似的问题吗?
string inStr = @"(P(X013,X015,AC1)>P(X014,X016,AC5))&(HSB(X013,X014)|HRB(X015,X016))";用我那会发的非正则程序可以得到正确结果由于你的要求是要括号配对,我觉得非正则方式,比如我用stack还清楚简单一些。
这种方式还是挺简便易懂的.感谢各位的帮助,结贴.