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

C# 用于验证用户输入的正则表达式,c#,regex,validation,expression,C#,Regex,Validation,Expression,我正在构建一个系统,在这个系统中,用户通过从组合框中选择操作数来构建查询(然后将操作数的名称放在$sign之间) 诸如此类的事情, 但是,由于允许用户输入括号和+、-、*和/。 因此,他也会犯类似的错误 eg. $Total$+1a eg. 78iu+$NumberPresent$ 等等 我需要一种方法来验证用户生成的查询 我该怎么做呢?正则表达式永远无法正确验证这样的查询。要么验证不完整,要么拒绝有效输入 在构建查询时,必须已经有了解析和执行查询的方法。为什么不使用解析代码来验证用户输入?如

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

诸如此类的事情, 但是,由于允许用户输入括号和+、-、*和/。 因此,他也会犯类似的错误

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

我需要一种方法来验证用户生成的查询


我该怎么做呢?

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


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

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

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

我需要一种方法来验证用户生成的查询

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

不过,你可以使用一个弱表达:一个易于书写和匹配的表达,并且禁止出现最明显的错误。有些输入仍然是非法的,但您会发现,正如Menno van den Heuvel所提供的那样,在解析时会发现这一点。这样做应该可以:

^(?:[-]?\(*)?(?:\$[A-Za-z][A-Za-z0-9_]*\$|\d+)(?:\)*[+/*-]\(*(?:\$[A-Za-z][A-Za-z0-9_]*\$|\d+))*(?:\)*)$
我需要一种方法来验证用户生成的查询

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

不过,你可以使用一个弱表达:一个易于书写和匹配的表达,并且禁止出现最明显的错误。有些输入仍然是非法的,但您会发现,正如Menno van den Heuvel所提供的那样,在解析时会发现这一点。这样做应该可以:

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

嘿,伙计们,我终于做到了我的目的(多亏了Anirudh())

我正在发布我的答案,因为它可能会帮助更多的访问者

 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);

嘿,伙计们,我终于做到了我的目的(多亏了Anirudh())

我正在发布我的答案,因为它可能会帮助更多的访问者

 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);

??? 为什么使用TroublePattern而不仅仅是TroublePattern.IsMatch(UserFedData)?…因为Regex.IsMatch的参数的数据类型。它应该是(string,string,RegexOption)。。此外,字符串“100*($Total+20k*Registered$-$NumberPresent$)与您的正则表达式匹配,尽管它是非法的。介于$符号之间的单词将从组合框中选择。据我记忆所及,没有你上面键入的内容。正如我所说,我的目的是通过正则表达式来实现的。???为什么使用TroublePattern而不仅仅是TroublePattern.IsMatch(UserFedData)?…因为Regex.IsMatch的参数的数据类型。它应该是(string,string,RegexOption)。。此外,字符串“100*($Total+20k*Registered$-$NumberPresent$)与您的正则表达式匹配,尽管它是非法的。介于$符号之间的单词将从组合框中选择。据我记忆所及,没有你上面键入的内容。正如我所说,我的目标是通过正则表达式来实现的。