有条件地用正则表达式替换字符串

时间:2016-05-19 07:21:15

标签: javascript regex regex-lookarounds

在node.js服务器中,我需要使用JavaScript转换URL地址,如下所示:

示例1:

hostA/blah/dir1/name/id.js?a=b --> name.hostC/dir2.js?guid=id&a=b

示例2:

hostB/dir1/name/id.js --> name.hostC/dir2.js?guid=id

转换是使用string.replace使用配置文件中详细说明的正则表达式完成的。

到目前为止,我有:

url.replace(/.*\\/dir1\\/(.*)\\/\\(d{2})\\.js?:(?=\?)(.*)/, "$1.hostC\/dir2.js?guid=$2");

替换字符串指定?guid=id。如何更改表达式或替换字符串,以便在示例1的情况下添加&originalQueryString(注意&符号),并且在示例2的情况下不添加任何内容?

2 个答案:

答案 0 :(得分:1)

这适用于您的示例:

text.replace(/.*?\/dir1\/([^\/]+)\/(.*?)\.js\??(.*)/i, "$1.hostC/dir2.js?guid=$2&$3").replace(/&$/, "")

您可以更改正则表达式选项以包含' g'或者' m',如果你的实施需要。

答案 1 :(得分:0)

您可以编写类似

的内容
/([^/]+)\/([^./]+)\.js(?:\?(.*))?$/

示例

> "hostA/blah/dir1/name/id.js".replace(/([^/]+)\/([^./]+)\.js(?:\?(.*))?$/, "$1.hostC/dir2.js?guid=$2&$3")
< "hostA/blah/dir1/name.hostC/dir2.js?guid=id&"

> "hostA/blah/dir1/name/id.js?a=b".replace(/([^/]+)\/([^./]+)\.js(?:\?
(.*))?$/, "$1.hostC/dir2.js?guid=$2&$3")
< "hostA/blah/dir1/name.hostC/dir2.js?guid=id&a=b"

如果尾随&有问题,可以将正则表达式分解为两个语句,

< "hostA/blah/dir1/name/id.js".replace(/([^/]+)\/([^./]+)\.js$/, "$1.hostC/dir2.js?guid=$2")
> "hostA/blah/dir1/name.hostC/dir2.js?guid=id"

> "hostA/blah/dir1/name/id.js?a=b".replace(/([^/]+)\/([^./]+)\.js(?:\?(.*))$/, "$1.hostC/dir2.js?guid=$2&$3")
< "hostA/blah/dir1/name.hostC/dir2.js?guid=id&a=b"