英特尔Mac上的Javascript Regex.是模式和子模式替换bug

Javascript Regex on Intel Mac. Are patterns and subpattern replacement buggy?

本文关键字:子模式 替换 bug 模式 Mac 上的 Javascript Regex 英特尔      更新时间:2023-09-26

我在带有OS X Lion的英特尔Mac上使用BBEdit。我想使用Javascript 将str="a,b,c,d,e,f,g,h,i.j"转换为str=["a","b"]["c","d"]["e,"f"]["g","h"]

我试过这个代码:

var myArray = str.replace(/('w+),('w+)/g,"["$1","$2"]")

我也尝试过:

var re = new RegExp("('w+),('w+)", "g");
var myArray = str.replace(re,"["$1“,"$2“]" );

两者都可以使用BBEdit自己的搜索/替换工具,也可以使用几个在线regex测试人员,但我无法在脚本中使用它。

我已经玩了两天的代码了,似乎问题是解释

var myArray2 = str.replace(/',/g,''"']','['"')

适用于生产a"],["b"],["c"],["d"],["e"],["f"],["g"],["h"],["i"],["j

我尝试了[a-zA-Z]而不是'w,但这也不起作用。有人经历过类似的问题吗?有人能提出解决办法吗?

我想我理解您想要做的事情,并且解决方案不涉及正则表达式。我会先解释一下原因。听我说完。

您正试图使用.replace()和正则表达式来解决问题,这意味着您正试图将字符串'str="a,b,c,d,e,f,g,h,i.j"'转换为字符串'str=["a","b"]["c","d"]["e,"f"]["g","h"]'

这很容易,而且你几乎做到了:

var original = 'str="a,b,c,d,e,f,g,h,i.j"';
var result = original.replace(/('w+),('w+)/g, '["$1","$2"]');
// result === 'str="["a","b"],["c","d"],["e","f"],["g","h"],i.j"';

请注意替换字符串周围的引号不匹配。或者,您可以转义字符串中的引号;"['"$1'",'"$2'"]"


然而,我怀疑这是否是你想要做的。我认为,相反,你试图将字符串"a,b,c,d,e,f,g,h,i.j"变成数组的数组,(在数组文字表示法中)将由:[["a","b"], ["c","d"], ["e,"f"], ["g","h"]]声明。

这不是用一个正则表达式就能做到的。对于正则表达式,您只能replace()表示匹配,test()表示匹配,或返回match() es。

试试这个(也可以在JSFiddle上):

var str = "a,b,c,d,e,f,g,h,i.j";
var parts = str.split(',');
var num_pairs = Math.floor(parts.length / 2);
var result = [];
for (var i=0; i < num_pairs; i+=1) {
    result.push([parts[i*2], parts[(i*2)+1]]);
}
// result === [["a", "b"], ["c", "d"], ["e", "f"], ["g", "h"]]

由于零件数量不均匀(i.j是第九个元素),您必须决定是否应该丢弃它(如本例所示)。否则,如果将Math.floor更改为Math.round,则最后一个数组将为["i.j", undefined]


顺便说一句:关于您的原始解决方案:

str.replace(/('w+),('w+)/g, "["$1","$2"]");

这不起作用的原因与'w无关。只是因为它抛出了一个SyntaxError。试试看你的JavaScript错误控制台。

这是因为你没有转义字符串中的-qoutes,但你也没有连接。也就是说,你本可以这样做:

str.replace(/('w+),('w+)/g, "["+$1+","+$2+"]");

注意连接,使用+。现在它是一个有效的字符串,不会抛出SyntaxError。但是,它将抛出一个TypeError,因为变量$1$2undefined。关键是把它变成一个完整的字符串:

str.replace(/('w+),('w+)/g, '["$1","$2"]');
// or
str.replace(/('w+),('w+)/g, "['"$1'",'"$2'"]");

replace()函数将用匹配的值替换字符串中的$-部分。