我正在尝试从给定字符串中提取变量名称,并将其替换为其他字符串。
例如,给定此字符串:
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
部分,但我想知道为什么会发生这种情况,我该如何解决这个问题。
我理解()
之间的部分通常在正则表达式中匹配,而其他所有部分都是模式的一部分。
非常感谢一个很好的解释,我真的想了解更多有关正则表达式的信息
答案 0 :(得分:5)
如果您查看documentation for replace,可以添加更多参数以达到您想要的效果。
函数的第一个参数' match'是整个匹配的字符串。跟随正则表达式中的捕获组一样多的附加参数(在您的情况下为一个)。
所以你可以改用:
testString.replace(/var ([a-zA-Z0-9_-]{1,})/g, function (match, captureOne) {
return captureOne;
});
答案 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_]
,+
表示一个或多个匹配。
<强>输出:强>
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;
答案 3 :(得分:1)
如果你只想要你的小组,只需获得第一个“带括号的子匹配”,这是回调函数的第二个参数:
testString.replace(/var ([a-zA-Z0-9_-]{1,})/g, function (match, p1) {
console.log(p1);
});
打印:
test1
test2
test-test
test_3