我需要查找并替换 JavaScript 代码中的变量。
假设我需要在给定代码中搜索“length”,我想排除“x.length”或“linelength”
示例输入 - 使调试更容易
var sampleStringWhichWorks = 'function checkLength(l, ls){\n' +
'var line, lines, len, length01, linelength11;\n' +
'line = l;\n' +
'lines = ls;\n' +
'len = line.length12;\n' +
'length02 = lines.length13;\n' +
'if(len==length03){\n' +
'len--;\n' +
'length04= length05 + 1;\n' +
'}\n' +
'linelength14 = len + length06;\n' +
'return linelength15;\n' +
'}\n';
这个/([^a-z.])length[\d]{2}([^a-z])/mig 表达式解决了问题,但是对于像“length04=length05 + 1”这样的行,它只捕获第一个长度并忽略第二个。
它确实适用于“length04 = length05 + 1”并捕获两个实例。
我添加了 [\d]{2} 只是为了更好地理解,这里的预期结果是捕获所有以 0 结尾的“长度”并忽略以 1 结尾的。
我尝试了其他选项,例如指定 [^a-z]{0,1},但没有解决问题。
检查 jsFiddle here .
实际输入和正则表达式 (/([^a-z.])length([^a-z])/mig)
function checkLength(l, ls){
var line, lines, len, length, lineLength;
line = l;
lines = ls;
len = line.length;
length = lines.length;
if(len == length){
len--;
length=length+1;
}
lineLength = len + length;
return lineLength;
}
预期结果
- var line,lines,len,长度,lineLength;
- 长度 =lines.length;
- if(len == 长度){
- 长度 = 长度 + 1;
- lineLength = len + 长度;
最佳答案
您遇到的问题是正则表达式匹配从上一个匹配的末尾开始,正如您在此示例中看到的:
([^a-z.])length[\d]{2}([^a-z])
length05
未被捕获,因为之前的 =
符号已被上一个匹配项占用...
所以你可以使用这个answer中指出的方法:
var regex = /([^a-z.])length[\d]{2}([^a-z])/mig
var matches = [], found;
while (found = regex.exec(string)) {
matches.push(found[0]);
regex.lastIndex = found.index+1;
}
console.log(matches);
您可以在这个 fiddle 中看到它的实际效果:http://jsfiddle.net/x6ARj/3/
编辑:
针对您的评论,如果您想替换字符串,一种解决方案是使用 slice
方法,使用 found.index
和 regex.lastIndex
索引:
var replacement = "name",
regex = /([^a-z.])length([\d]{2}[^a-z])/mi,
matches = [], found;
while (found = regex.exec(string)) {
string = string.slice(0, found.index) + found[1] + replacement + found[2] + string.slice(regex.lastIndex);
regex.lastIndex = found.index+1;
}
console.log(string);
关于JavaScript RegExp 没有给出期望的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19443823/