2016-05-18 284 views
1

我需要在C#中创建一个程序,将中缀表达式转换为前缀和后缀,将前缀表达式转换为后缀和中缀,将后缀表达式转换为中缀和前缀。但这不是问题,程序的“处理部分”已经完成。正则表达式验证前缀,中缀和后缀表达式

我现在需要的是一个正则表达式来验证用户输入是中缀,前缀还是后缀表达式,所以根据输入我调用不同的函数来执行转换。

的投入将永远是:
操作数:大写单字母从A到Z
对于运营商:+, - ,*,/和

对于中缀表达我做了这个正则表达式(这似乎工作正常):
"^(([A-Z])(([+]|[-]|[*]|[/])([A-Z]))*)$"

但我熄灭了我的想法,试图为前缀和后缀表达式进行正则表达式。我在网上也没有发现任何东西。

有人能给我一个灯吗?

+0

如果我理解正确,模式将只用于找出正在使用的符号,那么不需要捕获捕获组中的表达式的任何部分?此外,它的目的是你的模式不允许任何空格?前缀表示应该看起来像是“+ AB”还是“+ A B”? –

+0

@Rawing嗨。是的,我只需要找出正在使用的符号。它不应该有空格,所以我正在考虑'+ AB'而不是'+ A B'。 –

回答

0

不幸的是,这是不可能的,没有递归正则表达式(C#不支持)。虽然(格式良好的)中缀表示法可以与简单的正则表达式[A-Z](?:[*/+-][A-Z])*相匹配,但是前缀和后缀表示法并不遵循这样一个简单模式,以至于它们可以通过非递归正则表达式匹配。这就是说,确定表达式是否使用前/后缀表示法(不验证其正确性)的一种非常简单的方法是检查第一个/最后一个字符是否为运算符:^[*/+-]将匹配格式正确的前缀表达式和.*[*/+-]$格式正确的后缀表达式。

+0

嘿,你知道它将如何使用递归正则表达式吗? –

+0

@MatheusSousa:(?(DEFINE)(? [AZ])(? [* \/+ - ](?&expr)(?&expr))(?(?&number)|(?&op)| \ (??expr)(??expr)))(?&expr)'为前缀,'(?(DEFINE)(? [AZ])(?(?&expr)(?&expr)[* \/+ - ]) ???????(?&expr)'为后缀。??(?&number)|(?&op)| \((?&expr)\))) (两种模式都允许使用圆括号,如果你不想这样做,请移除'| \((?&expr)\)'部分。) –