我的代码试图将字符串输入拆分并通过拆分=,==和===将其保存到不同的列表,以便每个列表仅拆分相应的一个
var tokenEquals = code.split(/[=]/gi);
var tokenDoubleEquals = code.split(/[==]/gi);
var tokenTrippleEquals = code.split(/[===]/gi);
所以,如果代码是" = == ==="每个列表的长度应该只有2
但正在发生的事情是它在每个=上分裂,并且所有这些都以相同的数量结束7
我把它精炼到了
var tokenEquals = code.split(/\=(?!\=)/);
var tokenDoubleEquals = code.split(/\=\=(?!\=)/gi);
var tokenTrippleEquals = code.split(/\=\=\=/gi);
当前输出为:Equals length为4,Double Equals length为3,Tripple Equals length为2
什么时候都应该等于1
所以三重奏工作正常,但另外两部分没有。 我想知道将正则表达式字段放在哪个解决方案中的解决方案是什么只会导致它们仅在相应的等于的数量上进行拆分。
bellow是当我希望它返回[1,1,1]时当前返回[3,2,1]的代码的示例
var LLOCCounter = function() {};
LLOCCounter.prototype.count = function(code) {
var numberOfLLOC = [];
code = code.trim();
var tokenEquals = code.split(/\=(?!\=)/);
var tokenDoubleEquals = code.split(/\=\=(?!\=)/gi);
var tokenTrippleEquals = code.split(/\=\=\=/gi);
numberOfLLOC = [
tokenEquals.length - 1, // 4 =
tokenDoubleEquals.length - 1, // 5 ==
tokenTrippleEquals.length - 1, // 6 ===
]
console.log(numberOfLLOC)
};
contents = "= == ==="
llocCounter = new LLOCCounter();
numberOfLLOC = llocCounter.count(contents);

答案 0 :(得分:1)
我建议使用Mimicking Lookbehind in JavaScript文章中描述的模仿负面lookbehind技术。
我们的想法是使用split
方法中可以轻松使用的内容预处理您需要分割的符号。我建议使用_SiNgLe_
或类似的文字:
code = code.trim().replace(/(=)?=(?!=)/g, function($0, $1){ // Pre-process single =
return $1 ? $0 : '_SiNGlE_';
});
code = code.replace(/(=)?==(?!=)/g, function($0, $1){ // Pre-process double =
return $1 ? $0 : '_DoUbLe_';
});
code = code.replace(/(=)?===(?!=)/g, function($0, $1){ // Pre-process triple =
return $1 ? $0 : '_TrIpLe_';
});
var tokenEquals = code.split("_SiNGlE_"); // Split with the temp tokens
var tokenDoubleEquals = code.split("_DoUbLe_");
var tokenTrippleEquals = code.split("_TrIpLe_");
所以,基本上,这是它的工作原理:(=)?=(?!=)
包含一个可选的捕获组((=)?
),它可以捕获=
或将为空,然后{{1匹配(在其他两种模式中,分别为=
或==
),然后不应跟随===
(感谢否定前瞻=
)。在(?!=)
方法内部,回调用于分析匹配数据结构:如果组1(可选)匹配,则表示replace
之前存在=
(或=
或==
),我们不希望与===
(或=
或==
)匹配。 ===
代码就是这样:$1 ? $0 : '_SiNGlE_'
代表整个匹配(如果$0
(即组1值)不为空,只需重新插入找到的文本,否则,替换为一个临时令牌。
$1