JavaScript RegExp 没有给出期望的结果

标签 javascript regex

我需要查找并替换 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;
}

预期结果

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

最佳答案

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

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

Regular expression visualization

Debuggex Demo

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.indexregex.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/

相关文章:

javascript - 只有我使用innerHTML 添加的最后一个元素保留其事件处理程序,为什么?

javascript - 如何修改 ember 应用程序的主 ember cli 应用程序树

javascript - 将 HTML 源中的变量替换为 Angular

javascript - Google Analytics autotrack.js 插件 url 未加载

java - 正则表达式跨越两行,仅在单独的行上匹配

windows - 批处理文件中的 CSV 格式

objective-c - 使用 NSRegularExpression 命名捕获组

javascript - Object.assign 错误解决方法

regex - 匹配数字的正则表达式

java - 使用正则表达式转义java字符串中的文字