繁体   English   中英

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

[英]Format text with javascript from right to left using regular expressions

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

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,我可以利用它的智能/自动完成功能来确保我正确输入了功能名称。

现在这是我被困的地方

我想通知用户是否缺少在每个函数上传递参数的功能。

例如,如果用户键入:

  func2 x; y;  

那么我想告诉他func2缺少参数。

我知道问题出在如果用户键入以下内容:

 func2  x; func1 a; b; ; z ;

我设法用C#解决了这个问题。 这很容易。 我这样做的方法是开始从右到左查找功能。 因此,如果这样做,我将找到的第一个功能是func1对吗? 那么我会更正确,直到找到两个;如果替换func2 x; <temp> ; z ;它,我将得到: func2 x; <temp> ; z ; func2 x; <temp> ; z ; 注意我替换了func1 a; b; func1 a; b; 然后我可以继续做同样的事情,然后找到func2并选择直到3rd;

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

那么困难的部分是从右到左? 使用分割正则表达式然后反转

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/

您不能以可靠的方式为此使用正则表达式。 正则表达式是正则语言。 您已经引入了上下文相关性,这意味着从最严格的意义上讲您的语言不再是“常规的”。

您应该能够将c#代码移植到javascript。 您在c#中使用的JS遗漏了哪些字符串操作函数,使您认为应该在js中使用正则表达式?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM