2

我需要从 JavaScript 代码中查找和替换变量。

假设我需要在给定代码中搜索“长度”,我想排除“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';

这个 /([^az.])length[\d]{2}([^az])/mig 表达式解决了这个问题,但是对于像 "length04=length05 + 1" 这样的行它只捕获第一个长度并忽略第二个.

它适用于“length04 = length05 + 1”并捕获两个实例。

我添加了 [\d]{2} 只是为了更好地理解,这里的预期结果是捕获所有以 0 结尾的“长度”并忽略以 1 结尾。

我尝试了其他选项,例如指定 [^az]{0,1},但没有解决问题。

在此处检查 jsFiddle 。

实际输入和正则表达式 (/([^az.])length([^az])/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;
}

由此产生的预期结果

  1. var line, lines, len, length , lineLength;
  2. 长度=线。长度;
  3. 如果(长度 ==长度){
  4. 长度=长度+ 1;
  5. 线长= 长度 +长度
4

2 回答 2

3

您遇到的问题是正则表达式匹配从上一个匹配的末尾开始,正如您在此示例中看到的那样:

([^a-z.])length[\d]{2}([^a-z])

正则表达式可视化

调试演示

length05没有被捕获,因为=它之前的标志已经被上一场比赛拿走了......

因此,您可以使用此答案中指示的方法:

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/


编辑 :

针对您的评论,如果您想替换字符串,一种解决方案是使用sliceusingfound.indexregex.lastIndexindex 的方法:

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);
于 2013-10-18T08:00:58.327 回答
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请注意,如果匹配发生在字符串开头以外的任何其他位置,则正则表达式必须先捕获字符。由于 JavaScript 可悲地缺乏对后向断言的支持,这是不可避免的。因此,您需要检查匹配的长度,如果长度为 7,则将第一个字符切掉。

于 2013-10-18T07:23:30.933 回答