JavaScript正则表达式:有没有一种方法可以在URL中匹配一个接一个的斜杠字符而无需负查找?
我正在尝试匹配url中的斜杠,该url不是协议或查询字符串的一部分 有没有其他方法可以使用正则表达式但不使用lookback,因为并非所有浏览器都支持它 我举的例子:JavaScript正则表达式:有没有一种方法可以在URL中匹配一个接一个的斜杠字符而无需负查找?,javascript,regex,Javascript,Regex,我正在尝试匹配url中的斜杠,该url不是协议或查询字符串的一部分 有没有其他方法可以使用正则表达式但不使用lookback,因为并非所有浏览器都支持它 我举的例子: const URL=` https://asdf.com//asdf//asdf http://asdf.com//asdf//asdf ftp://asdf.com//asdf//asdf //asdf.com//asdf//asdf //asdf.com//asdf//asdf?测试=// z39.50s://asdf// `
const URL=`
https://asdf.com//asdf//asdf
http://asdf.com//asdf//asdf
ftp://asdf.com//asdf//asdf
//asdf.com//asdf//asdf
//asdf.com//asdf//asdf?测试=//
z39.50s://asdf//
`.替换(/(?您可以使用
.replace(/^(\S*?\/\/)|(\?.*)$|(\/)+/g, '$1$2$3')
看
详细信息
^(\S*?\/\/)
-第1组(后面用替换模式中的$1
表示):从字符串开始到第一个/
0个或更多非空白字符,尽可能少
|
-或
(\?*)$
-第2组($2
):一个?
字符和字符串的其余部分
|
-或
(\/)+
-组3($3
)捕获单个/
字符1次或多次(每个捕获的/
将覆盖组内存缓冲区中的前一个字符,因为它是一个“”)
您可以使用
.replace(/^(\S*?\/\/)|(\?.*)$|(\/)+/g, '$1$2$3')
看
详细信息
^(\S*?\/\/)
-第1组(后面用替换模式中的$1
表示):从字符串开始到第一个/
0个或更多非空白字符,尽可能少
|
-或
(\?*)$
-第2组($2
):一个?
字符和字符串的其余部分
|
-或
(\/)+
-组3($3
)捕获单个/
字符1次或多次(每个捕获的/
将覆盖组内存缓冲区中的前一个字符,因为它是一个“”)
查找缺陷的正常解决方法是使用回调函数
在替换零件中。
原因是您必须匹配错误的部分才能移动匹配位置
这需要回调函数中的逻辑
在99.99%的情况下,如果您有不同的替代品,您必须这样做
对于您的情况,这并不重要,因为您有一个空白的替换件。
在剥离由
不在一个小组里
如果要用空字符串以外的任何内容替换它,
这是唯一的办法
为此,这里是您的(大部分)未更改的正则表达式,用于回调
( # (1 start)
(?: ^ [\w\d\-.]{2,} : | ^ | \? .* )
//
) # (1 end)
| /
(?= / )
var url=[
'https://asdf.com//asdf//asdf',
'http://asdf.com//asdf//asdf',
'ftp://asdf.com//asdf//asdf',
“//asdf.com//asdf//asdf”,
“//asdf.com//asdf//asdf?test=//”,
'z39.50s://asdf/'];
对于(var i=0;i console.log(URL);
查找缺陷的正常解决方法是使用回调函数
在替换零件中。
原因是您必须匹配错误的部分才能移动匹配位置
这需要回调函数中的逻辑
在99.99%的情况下,如果您有不同的替代品,您必须这样做
对于您的情况,这并不重要,因为您有一个空白的替换件。
在剥离由
不在一个小组里
如果要用空字符串以外的任何内容替换它,
这是唯一的办法
为此,这里是您的(大部分)未更改的正则表达式,用于回调
( # (1 start)
(?: ^ [\w\d\-.]{2,} : | ^ | \? .* )
//
) # (1 end)
| /
(?= / )
var url=[
'https://asdf.com//asdf//asdf',
'http://asdf.com//asdf//asdf',
'ftp://asdf.com//asdf//asdf',
“//asdf.com//asdf//asdf”,
“//asdf.com//asdf//asdf?test=//”,
'z39.50s://asdf/'];
对于(var i=0;i console.log(URL);
这让人惊讶。你想在这里匹配什么?据我所知,你的示例中没有双冒号。不清楚在你的示例中应该匹配什么…尝试。替换(/^(\s*?\/\/)\/)\(\/)+/gm,$1$2)
,请参阅。通常使用https?:
代替\S*?
,如果可以定义协议模式,可能会更安全。然后应该是。替换(/^(\S*?\/\/)\124;(\?*)$\ 124;(\/)+/g,$1$2$3'))
,请参阅。令人惊讶的是。您想在这里匹配什么?据我所知,您的示例中没有双冒号。不清楚在您的示例中应该匹配什么…请尝试。替换(/^(\s*?\/)\/)\(\/)+/gm,$1$2)
,请参阅。通常使用https?:
来代替\S*?
,如果可以定义协议模式,可能会更安全。然后应该是。替换(/^(\S*?\/\/)\124;(\?*)$\ 124;(\/)+/g,$1$2$3')
,请参阅。