我有专门的内置功能,管理员可以通过网站执行。为简单起见,我们假装只有两个函数:
1) func1 "requires 2 paramters"
2) func2 "requires 3 paramters"
所以我有一个文本框,用户可以在其中输入以下内容:我使用';'分开参数
func1 x; y; // func1(x,y) is more understandable. func1 takes two parameters
或
func2 1; 2+2; 4; // note that func2 takes 3 parameters...
甚至更复杂的嵌套函数,例如;
func2 x; func1 a; b; ; z ; // for example in this example 1st parameter = x
2nd parameter = func1 a; b; // note this is a function
3rd parameter = z
在jquery的帮助下,我可以利用它的intellecence / autocomplete函数来确保正确输入函数的名称。
我想告诉用户他是否缺少传递每个功能的参数。
例如,如果用户键入:
func2 x; y;
然后我想告诉他func2缺少一个参数。
我知道,如果用户输入类似的内容,问题就在于:
func2 x; func1 a; b; ; z ;
我已经设法用c#解决了这个问题。这是非常大的。我这样做的方法是从右到左开始寻找功能。所以,如果我这样做,我会发现第一个函数是func1对吗?然后我会更加正确,直到找到两个;如果我替换它,那么我会:func2 x; <temp> ; z ;
注意我替换了func1 a; b;
然后我可以继续做同样的事情然后我会找到func2和选择直到第3个;
问题是,如果我创建一个正常的表达式,我不知道如何从右到左开始查看。如果我从左到右开始看它是默认值,那么func2会有第一个paramter = x,它是第二个paramter = func1 a,它是第三个参数= b。事实并非如此。另一方面,如果我从右到左开始做同样的事情,一切都会成功。
答案 0 :(得分:1)
所以困难的部分是从右到左?使用拆分正则表达式,然后反向
var valid_functions = ["func1","func2"]
var valid_params = [4,1]
var f_regex = new RegExp("\\b("+valid_functions.join("|")+")\\b");
var f_data = "func2 x; func1 a; b; ; z ;".split(f_regex).reverse();
for(var i=0;i<f_data.length;i+=2){
if(f_data[i] === ""){continue}
var f_name = f_data[i+1],
f_params = f_data[i];
var pos = valid_functions.indexOf(f_name);
if( f_params.split(";").length-1 !== valid_params[pos]){
alert("Wrong number of arguments for " + f_name)
}
}
参数数量不正确的函数示例:http://jsfiddle.net/tHcYM/1/
答案 1 :(得分:0)
您无法以可靠的方式使用正则表达式。正则表达式是常规语言。您已经引入了上下文依赖,这意味着您的语言不再是最严格意义上的“常规”。
您应该能够将c#代码移植到javascript。您在c#中使用的JS中“缺少”哪些字符串操作函数会让您认为应该在js中使用正则表达式?