Javascript 具有多个条件的正则表达式

Javascript Regular Expression with multiple conditions

我正在使用 Nginx njs 模块进行一些 url 修改。

我的用例是 return 给定 uri 的重定向 uri。

URI 如下:

/books
/books/economic-genious
/books/flight-mechanics

我的正则表达式匹配上面的 URI 如下 -

/books/(.*)|/books$

表达式 /books/(.*) 的第一部分匹配以下 URI:

/books/economic-genious
/books/flight-mechanics

表达式 /books$ 的第二部分匹配以下 URI:

/books 

我的目的地配置如下:/ebooks/。这样上面的 URI 将被转换为:

/ebooks
/ebooks/economic-genious
/ebooks/flight-mechanics

Javascript代码:

function getMappedURI(uri) {
    var exp = new RegExp('/books/(.*)|/books$');
    var destUri = '/ebooks/';
    var redirectUri = uri.replace(exp, destUri);
    return redirectUri;
}

以上代码适用于以下 URI:

/books/economic-genious
/books/flight-mechanics

但对于 URI /books,它应该 return /ebooks/。但是它在 /ebooks/.

的末尾附加了一些不可打印的特殊字符

我认为它试图用一些特殊字符替换

如何避免在末尾添加特殊字符?

OR | 运算符仅适用于括号。所以你应该匹配 (/books/(.*)|/books$) 我不认为 $ 这个词匹配,因为要匹配任何东西它也应该在括号中,使新匹配 URL :(/books/(.*)|/books)。然后,您必须使用 $2 而不是 $1 作为替代品。

function getMappedURI(uri) {
    var exp = new RegExp('(/books/(.*)|/books)');
    var destUri = '/ebooks/';
    var redirectUri = uri.replace(exp, destUri);
    return redirectUri;
}

但是,如果您想要从 /books/foo/ebooks/foo 的所有内容,请改用:/books/(.*) 和 $1 作为替代。

function getMappedURI(uri) {
    var exp = new RegExp('/books/(.*)');
    var destUri = '/ebooks/';
    var redirectUri = uri.replace(exp, destUri);
    return redirectUri;
}

试试这个正则表达式:\/books(\/(.*))?$

Demo 这里...

代码:

function getMappedURI(uri) {
    var exp = new RegExp('\/books(\/(.*))?$');
    var destUri = '/ebooks';
    var redirectUri = uri.replace(exp, destUri);
    return redirectUri;
}