Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用正则表达式从右向左使用javascript格式化文本_Javascript_Regex_Formatting - Fatal编程技术网

使用正则表达式从右向左使用javascript格式化文本

使用正则表达式从右向左使用javascript格式化文本,javascript,regex,formatting,Javascript,Regex,Formatting,我有特定的内置功能,管理员可以通过网站执行。为了简单起见,我们假设只有两个函数: 1) func1 "requires 2 paramters" 2) func2 "requires 3 paramters" 所以我有一个文本框,用户可以在其中输入这样的内容:我使用“;”分离参数 或 或者更复杂的嵌套函数,例如 func2 x; func1 a; b; ; z ; // for example in this example 1st parameter = x

我有特定的内置功能,管理员可以通过网站执行。为了简单起见,我们假设只有两个函数:

1) func1 "requires 2 paramters"

2) func2 "requires 3 paramters"
所以我有一个文本框,用户可以在其中输入这样的内容:我使用“;”分离参数

或者更复杂的嵌套函数,例如

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的帮助下,我可以利用它的智能/自动完成功能来确保正确键入函数名

这就是我被困的地方 如果用户没有在每个函数上传递参数,我会通知用户

例如,如果用户键入:

  func2 x; y;  
然后我想通知他func2缺少一个参数

我知道这很容易。问题是如果用户键入以下内容:

 func2  x; func1 a; b; ; z ;
我已经设法用c解决了这个问题。这很容易。我这样做的方式是从右到左开始寻找函数。如果我这样做,我会找到的第一个函数是func1,对吗?然后我会更正确,直到我找到两个;'如果我替换它,那么我将得到:func2x;Z注1替换为1 a;B然后我可以继续做同样的事情,然后找到func2并选择直到第三天;'


问题是,如果我创建一个常规表达式,我不知道如何从右向左看。如果我开始从左向右看,就像它是默认值一样,那么func2的第一个参数=x,第二个参数=func1a,第三个参数=b。事实并非如此。另一方面,如果我从右到左做同样的事情,一切都会好起来

您不能以可靠的方式使用正则表达式。正则表达式是正则语言。您引入了上下文依赖,这意味着您的语言不再是严格意义上的规则语言


您应该能够将c代码移植到javascript。您在c中使用的JS缺少哪些字符串操作函数,使您认为应该在JS中使用regex?

那么,最难的部分是从右向左?使用splitregex,然后使用reverse

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

参数数目不正确的函数示例:

我知道我可以使用c代码。但我不想每次用户键入字符时都发出ajax请求。如果我可以在客户端用javascript验证它,而不是让服务器来验证,那就太好了。没有太多的函数,我认为实现起来应该不会太复杂……对,我不是建议您直接使用c代码,而是建议您不需要使用正则表达式来完成这项任务。为什么不在js中实现与在c中使用的相同的算法呢?您使用的是什么浏览器。当我输入func2x时;职能1 a b;Z它并没有说这个函数是无效的。回想一下,func1需要2个参数,而func2需要3个参数。谢谢你的帮助!固定,在有效函数中写入有效函数的名称;在valid params中,本例中每个参数的正确参数数,func1接受4个参数。如果要在旧浏览器中使用此代码,必须实现Array.indexOf,请从此处复制此代码:
 func2  x; func1 a; b; ; z ;
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)
    }
}