奇怪的行为javascript regexp

Strange behavior javascript regexp

本文关键字:javascript regexp      更新时间:2023-09-26
console.log("url/page/value".match(/'/([a-zA-Z0-9]+)/g));
为什么这段代码返回一个数组:[/page,/value]?为什么捕获符号"/"?

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

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

您正在用'转义/,试试这个,即'/表示/

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

因为

  1. 您的正则表达式中的'/意味着:匹配文字字符/(正斜杠必须由反斜杠转义,因为它也是/pattern delimiter/)
  2. g修饰符使您返回所有匹配

放在一起,正则表达式'/([a-zA-Z0-9]+)的意思是:

  1. 匹配文字字符/
  2. 匹配一个或多个字母或数字字符,捕获到第1组

那么这将匹配/somethingLikeThis

您可以在这个演示中清楚地看到这一点,并通过添加字符串来查看匹配的内容,或者通过编辑正则表达式进行实验。

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

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