用于验证用户输入的正则表达式

时间:2013-12-09 07:43:17

标签: c# regex validation expression

我正在构建一个系统,用户通过从组合框中选择操作数来构建查询(然后将操作数的名称放在$符号之间)。

eg. $TotalPresent$+56
eg. $Total$*100
eg 100*($TotalRegistered$-$NumberPresent$)

这样的事情, 但是,因为允许用户输入括号和+, - ,*和/。 因此,他也可以犯错误,如

eg. $Total$+1a
eg. 78iu+$NumberPresent$

... ETC

我需要一种方法来验证用户构建的查询。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

正则表达式永远无法正确验证这样的查询。您的验证将不完整,或者您将拒绝有效的输入。

在构建查询时,您必须已经解析并执行它。为什么不使用解析代码来验证用户输入?如果您想进行客户端验证,可以使用对服务器的ajax调用。

答案 1 :(得分:0)

  

我需要一种方法来验证用户构建的查询。

就个人而言,我认为在这里使用正则表达式并不是一个好主意。在某些扩展的帮助下可以实现(例如,请参阅here),但原始的Kleene表达式不适合检查无限括号的数量是否平衡。更糟糕的是,过于困难的表达可能会导致大量时间和内存消耗,为拒绝服务攻击打开了大门(如果您的服务是公开的)。

你可以使用弱表达式:一个易于编写和匹配的表达式,并禁止最明显的错误。一些输入仍然是非法的,但你会发现解析时,正如Menno van den Heuvel所说。这样的事情应该做:

^(?:[-]?\(*)?(?:\$[A-Za-z][A-Za-z0-9_]*\$|\d+)(?:\)*[+/*-]\(*(?:\$[A-Za-z][A-Za-z0-9_]*\$|\d+))*(?:\)*)$

答案 2 :(得分:0)

嘿伙计们,我设法达到了目的(感谢Anirudh(Validating a String using regex))

我发布了答案,因为它可能会帮助更多访问者。

 string UserFedData = ttextBox1.Text.Trim().ToString(); 
  //this is a regex to detect conflicting user built queries.
   var troublePattern = new Regex(@"^(\(?\d+\)?|\(?[$][^$]+[$]\)?)([+*/-](\(?\d+\)?|\(?[$][^$]+[$]\)?))*$");
   //var troublePattern = new Regex(@"var troublePattern = new Regex(@"^(?:[-]?\(*)?(?:\$[A-Za-z][A-Za-z0-9_]*\$|\d+)(?:\)*[+/*-]\(*(?:\$[A-Za-z][A-Za-z0-9_]*\$|\d+))*(?:\)*)$");
 string TroublePattern = troublePattern.ToString();


//readyToGo is the boolean that indicates if further processing of data is safe or not
                        bool readyToGo = Regex.IsMatch(UserFedData, TroublePattern, RegexOptions.None);