【问题标题】:Regex expression to validate a user input用于验证用户输入的正则表达式
【发布时间】:2013-12-09 07:43:16
【问题描述】:

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

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

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

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

等...

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

我该怎么做?

【问题讨论】:

    标签: c# regex validation expression


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        嘿伙计们,我成功了(感谢 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);
        

        【讨论】:

        • ???为什么你使用 TroublePattern 而不仅仅是 TroublePattern.IsMatch(UserFedData) ?..
        • 因为 Regex.IsMatch 的参数的数据类型。它应该是 (string,string,RegexOption)。
        • It is not the only option。此外,字符串 "100*($Total+20k*Registered$-$NumberPresent$)" 与您的正则表达式匹配,尽管它是非法的。
        • $ 符号之间的单词将从组合框中选择。据我记得,上面没有您输入的任何内容。所以正如我所说,正则表达式可以满足我的目的。
        猜你喜欢
        • 2016-02-26
        • 2013-11-13
        • 2013-12-12
        • 1970-01-01
        • 2014-12-23
        • 2011-06-09
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多