我正在构建一个系统,用户通过从组合框中选择操作数来构建查询(然后将操作数的名称放在$符号之间)。
eg. $TotalPresent$+56
eg. $Total$*100
eg 100*($TotalRegistered$-$NumberPresent$)
这样的事情, 但是,因为允许用户输入括号和+, - ,*和/。 因此,他也可以犯错误,如
eg. $Total$+1a
eg. 78iu+$NumberPresent$
... ETC
我需要一种方法来验证用户构建的查询。
我该怎么做?
答案 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);