JavaScript RegExp未给出所需结果

JavaScript RegExp未给出所需结果,javascript,regex,Javascript,Regex,我需要从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 =

我需要从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';
此/[^a-z.]length[\d]{2}[^a-z]/mig表达式解决了此问题,但对于像length04=length05+1这样的行,它只捕获第一个长度,而忽略第二个长度

它确实适用于length04=length05+1,并捕获这两个实例

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

我尝试了其他选项,比如指定像[^a-z]{0,1},但没有解决问题

检查JSFIDLE

实际输入和正则表达式/[^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;
}
本次会议的预期结果

变量行、行、长度、线宽; 长度=行。长度; iflen==长度{ 长度=长度+1; 线宽=长度+长度; 如果要匹配长度,当且仅当其前面没有[a-z.]且后面没有[a-z.]时,则可以使用以下方法:

/(^|[^a-z.])length(?![a-z])/mig
说明:

请注意,如果匹配发生在字符串开头以外的任何地方,正则表达式将必须捕获长度之前的字符。这是不可避免的,因为JavaScript遗憾地缺乏对查找断言的支持。因此,您需要检查匹配的长度,如果长度为7,则切掉第一个字符。

匹配长度当且仅当其前面没有[a-z.]且后面没有[a-z.]时,您可以使用:

/(^|[^a-z.])length(?![a-z])/mig
说明:


请注意,如果匹配发生在字符串开头以外的任何地方,正则表达式将必须捕获长度之前的字符。这是不可避免的,因为JavaScript遗憾地缺乏对查找断言的支持。因此,您需要检查匹配的长度,如果长度为7,则切掉第一个字符。

您必须知道,正则表达式匹配从上一个匹配的末尾开始,正如您在本示例中看到的:

([^a-z.])length[\d]{2}([^a-z])
length05未被捕获,因为=在上一场比赛已经使用之前就已签名

因此,您可以使用以下所示的方法:

你可以在这把小提琴中看到它的作用:

编辑:

对于您的评论,如果要替换字符串,一种解决方案是使用slice方法,使用find.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);

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

([^a-z.])length[\d]{2}([^a-z])
length05未被捕获,因为=在上一场比赛已经使用之前就已签名

因此,您可以使用以下所示的方法:

你可以在这把小提琴中看到它的作用:

编辑:

对于您的评论,如果要替换字符串,一种解决方案是使用slice方法,使用find.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);

你也可以用它来快速测试正则表达式我得告诉你,我读这篇文章不是因为我不想帮忙,而是因为三十行中有十种不同的文本样式。对不起,这让我很头疼。@Steve-注意,编辑过了长度0x之前/之后你到底允许什么?点似乎是禁止的,但允许等号-什么这里的规则?正则表达式都是关于规则的。你需要精确地定义它们。@TimPietzcker-Before:anythingthan[a-z]和“.”;After:anythingthan[a-z]你也可以用它来快速测试正则表达式我得告诉你,我读这篇文章不是因为我不想帮忙,而是因为三十行中有十种不同的文本样式。对不起,这让我很头疼。@Steve-注意,编辑过了长度0x之前/之后你到底允许什么?点似乎是禁止的,但允许等号-什么这里的规则?正则表达式都是关于规则的。你需要精确地定义它们。@TimPietzcker-Before:anythingthan[a-z]和“.”;After:anythingthan[a-z]actaul代码将没有长度01或长度11,我添加了它们以使其更易于计数,并解释我的错误problem@AjayBhosale:此答案使用了前瞻性断言。您尝试过吗?actaul代码将没有长度01或长度11,我添加了它们以使其更易于计数,并解释我的错误problem@AjayBhosale:此答案使用前瞻性断言。你试过了吗?+1,很好,非常感谢,我还认为=被早期的匹配捕获了,我现在需要考虑如何使用它来替换它…我使用了“$1SOME-OTHER-NAMKE-而不是-LENGTH$2”你是指一个动态名称,比如:var name=some_name,regex=new RegExp[^a-z.]+name+[\\d]{2}[^a-z],mig;。是的,我想用其他名称替换一些名称,同时保留捕获的部分,因此我正在执行代码。replaceregex,$1some\u other\u name$2'将一些名称替换为其他名称_name@AjayBhosale:注意,前瞻断言消除了任何手动重设的需要
设置匹配的索引计数器正是因为前瞻不参与实际的匹配。我同意@TimPietzcker的意见,在这里的示例中,我们不需要对额外字符进行验证,但在某些情况下,我们需要在正则表达式中使用这个额外字符,在这种情况下,这个问题是相关的+1,太好了,非常感谢,我还以为=被之前的比赛捕获了,我现在需要考虑如何用它来代替它。。。我用了“$1SOME-OTHER-NAMKE-而不是-LENGTH$2”你的意思是一个动态名称,比如:var name=some_name,regex=new RegExp[^a-z.]+name+[\\d]{2}[^a-z],mig;。是的,我想在保留捕获的部分的同时用其他名称替换一些名称,所以我在做code.replaceregex,“$1some_other_name$2”用some_other替换some_name_name@AjayBhosale:请注意,前瞻断言消除了手动重置匹配的索引计数器的需要,因为前瞻不参与实际的匹配。我同意@TimPietzcker comment在本例中的说法,我们实际上不需要对额外字符但在某些情况下,我们需要在正则表达式中使用这个额外字符,在这种情况下,这个问题是相关的!