我需要从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';
这/ / [^^.])length[\d]{2}([^az])/mig表达式解决了这个问题,但对于像“length04 = length05 + 1”这样的行,它只捕获了第一个长度而忽略第二。
它适用于“length04 = length05 + 1”并捕获两个实例。
我添加[\ d] {2}只是为了更好地理解,这里的预期结果是捕获以0结尾的所有'length'并忽略以1结尾。
我尝试了其他选项,例如指定[^ a-z] {0,1},但没有解决问题。
检查jsFiddle here。
实际输入和正则表达式(/([^ a-z。])长度([^ 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;
}
此预期结果
答案 0 :(得分:2)
如果您希望匹配length
当且仅当[a-z.]
之前没有[a-z]
而不是/(^|[^a-z.])length(?![a-z])/mig
之后,那么您可以使用此项:
(^|[^a-z.]) # Match either the start of the line or a char other than [a-z.]
length # Match "length0"
(?![a-z]) # Assert that there is no [a-z] following the current match
<强>说明:强>
length
请注意,如果匹配发生在除字符串开头之外的任何其他位置,则正则表达式必须捕获{{1}}之前的字符。这是不可避免的,因为JavaScript缺乏对lookbehind断言的支持。因此,您需要检查匹配的长度,如果长度为7,则切掉第一个字符。
答案 1 :(得分:2)
您遇到的问题是正则表达式匹配从上一个匹配结束开始,正如您在此示例中看到的那样:
([^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);
你可以在这个小提琴中看到它: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);