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

时间:2012-01-11 04:34:02

标签: javascript regex formatting

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

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。事实并非如此。另一方面,如果我从右到左开始做同样的事情,一切都会成功。

2 个答案:

答案 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中使用正则表达式?