用于提取变量名的正则表达式

时间:2014-01-08 20:37:40

标签: javascript regex replace

我正在尝试从给定字符串中提取变量名称,并将其替换为其他字符串。

例如,给定此字符串:

  

var test1 = 1; var test2 = 2; var test-test = 1 var test_3 = 3;

我需要提取 test1 test2 test-test 和* test_3 *并将其替换为其他内容。

我尝试的是以下模式:

var ([a-zA-Z0-9_-]{1,})

我自己想出了它,从我对正则表达式的一点点知识,据我所知它应该匹配(贪婪)一个以var开头的字符串,包含小写和大写字母,以及字符-_

但是,当我使用替换运行时,匹配为var name而不仅仅是name

testString.replace(/var ([a-zA-Z0-9_-]{1,})/g, function (match) {
    return match;
});

你可以在这里看到一个小提琴:http://jsfiddle.net/HyBZy/

这本身并不是一件大事,因为我可以简单地从比赛中删除var部分,但我想知道为什么会发生这种情况,我该如何解决这个问题。 我理解()之间的部分通常在正则表达式中匹配,而其他所有部分都是模式的一部分。

非常感谢一个很好的解释,我真的想了解更多有关正则表达式的信息

4 个答案:

答案 0 :(得分:5)

如果您查看documentation for replace,可以添加更多参数以达到您想要的效果。

函数的第一个参数' match'是整个匹配的字符串。跟随正则表达式中的捕获组一样多的附加参数(在您的情况下为一个)。

所以你可以改用:

testString.replace(/var ([a-zA-Z0-9_-]{1,})/g, function (match, captureOne) {
    return captureOne;
});

此处a fork of your fiddle

答案 1 :(得分:2)

您可以使用以下方法稍微修改您的代码:

var newString = testString.replace(/var ([a-zA-Z0-9_-]{1,})/g, function ($0, $1) {
    return $1;
});

诀窍是在这里使用$1作为返回语句,它与正则表达式中的第1组匹配(已经正确),但您可以将其缩短为:

/var ([\w-]+)/g

由于\w表示[A-Za-z0-9_]+表示一个或多个匹配。

JSFiddle

<强>输出:

test1
test1
test-test
test_3

答案 2 :(得分:1)

这将为您提供所有变量名称:

var str = "var test1 = 1; var test2=2; var test-test=1; var test_3=3;";

var matches;
var regex = /var\s+(.*?)[\s=].*?;/g;
while (matches = regex.exec(str)) {
    console.log(matches[1]);
}

以下是如何替换姓名:

var str = "var test1 = 1; var test2=2; var test-test=1; var test_3=3;";
var cntr = 0;
var base = "base";
var output = str.replace(regex, function(match, p1, p2, p3) {
    return p1 + base + cntr++ + p3;
});
console.log(output);  // generates var base0 = 1; var base1=2; var base2=1; var base3=3; 

演示:http://jsfiddle.net/jfriend00/93ZHA/

答案 3 :(得分:1)

如果你只想要你的小组,只需获得第一个“带括号的子匹配”,这是回调函数的第二个参数:

testString.replace(/var ([a-zA-Z0-9_-]{1,})/g, function (match, p1) {
    console.log(p1);
});

打印:

test1
test2
test-test
test_3 

The replace function is very well documented on MDN