JavaScript RegExp没有给出期望的结果

时间:2013-10-18 07:19:44

标签: 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';

这/ / [^^.])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;
}

此预期结果

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

2 个答案:

答案 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])

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);

你可以在这个小提琴中看到它: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);