奇怪的行为javascript regexp

时间:2014-06-15 16:16:33

标签: javascript regex

console.log("url/page/value".match(/\/([a-zA-Z0-9]+)/g));

为什么这段代码会返回一个数组:[/ page,/ value]?为什么捕获符号'/'?

jsfiddle:http://jsfiddle.net/wq93T/

提前致谢。

4 个答案:

答案 0 :(得分:1)

因为

  1. 正则表达式中的\/表示:匹配文字字符/(正斜杠必须通过反斜杠进行转义,因为它也是/pattern delimiter/
  2. g修饰符可让您返回所有匹配
  3. 一起使用正则表达式\/([a-zA-Z0-9]+)表示:

    1. 匹配文字字符/
    2. 匹配一个或多个字母或数字字符,将其捕获到第1组。
    3. 所以这将匹配/somethingLikeThis

      您可以在this demo中清楚地看到,并通过添加字符串来查看匹配项或通过编辑正则表达式进行实验。

答案 1 :(得分:1)

您正在使用/转发\尝试此操作,即\/表示/

 console.log("url/page/value".match(/([a-zA-Z0-9]+)/g));

答案 2 :(得分:1)

var path = "url/page/value";
var regex = /\/([a-zA-Z0-9]+)/g;
var match = regex.exec(path);
console.log(match[0]); // "/page"
console.log(match[1]); // "page"

match = regex.exec(path);
console.log(match[0]); // "/value"
console.log(match[1]); // "value"

match = regex.exec(path);
console.log(match); //null

JSFiddle

exec返回的数组包含索引0中的整个匹配,并在后续索引处捕获(括号中的值)(首先是1,秒是2等)。

作为一条线:

console.log(/\/([a-zA-Z0-9]+)/g.exec("url/page/value")[1]); // "page"

作为返回捕获数组的函数:

var path = "url/page/value";
var regex = /\/([a-zA-Z0-9]+)/g;

console.log(capturedMatch(path, regex, 1));

function capturedMatch(str, rgx, index) {
    var m;
    var res = [];
    while((m = rgx.exec(str)) != null) {
        res.push(m[index]);
    }
    return res;
}

JSFiddle

答案 3 :(得分:0)

如果您不希望/,则表达式可以进一步简化为:

console.log("url/page/value".match(/[a-zA-Z0-9]+/g));

或者

console.log("url/page/value".match(/[^\/]+/g));

或者

console.log("url/page/value".split('/'));

JS FIDDLE DEMO