Javascript 正则表达式匹配所有'&';在第一个';之前';

Javascript 正则表达式匹配所有'&';在第一个';之前';,javascript,regex,Javascript,Regex,基本上,我想做“zipzam&&&&&&&&&&&&-”>“zipzam%26%26&&&&&&&&”。我可以在没有正则表达式的情况下用很多不同的方法来做,但是如果我能用正则表达式来做的话,事情会变得更干净一些 谢谢 编辑:“zip=zam&&&&&&&&&&&”>“zip=zam%26%26=?&&&&&&&&&&&&&&”应该会让事情更清楚一些 编辑:“zip=zam=&=&=&=?&&&&&&&&&“->”zip=zam=%26=%26=?&&&&&&&&&“应该会让事情更清楚 然而,这些

基本上,我想做“zipzam&&&&&&&&&&&&-”>“zipzam%26%26&&&&&&&&”。我可以在没有正则表达式的情况下用很多不同的方法来做,但是如果我能用正则表达式来做的话,事情会变得更干净一些

谢谢

编辑:“zip=zam&&&&&&&&&&&”>“zip=zam%26%26=?&&&&&&&&&&&&&&”应该会让事情更清楚一些

编辑:“zip=zam=&=&=&=?&&&&&&&&&“->”zip=zam=%26=%26=?&&&&&&&&&“应该会让事情更清楚

然而,这些只是例子。我仍然希望替换第一个“?”之前的所有“&”,无论“&”在第一个“?”之前的什么位置,也不管“&”是否连续。

这应该可以做到:

^[^?]*&[^?]*\?
"zip=zam=&=&=&=?&&&?&&&".replace(/^[^?]+/, function(match) { return match.replace(/&/g, "%26"); });

在这种情况下,正则表达式并不是最适合使用的东西。最好只需搜索第一个索引“?”然后替换每个“&”字符。然而,如果你真的想要一个正则表达式,那么这就可以了

(?:.*?(&))*?\?
或者这个,我想:

^[^?]*(&+?)\?

您需要负面外观,这在JS中很难复制,但幸运的是有一些方法:

var x = "zipzam&&&?&&&?&&&";

x.replace(/(&+)(?=.*?\?)/,function ($1) {for(var i=$1.length, s='';i;i--){s+='%26';} return s;})
评论:这是因为它不是全球性的。因此,第一个匹配是给定的,使用函数循环实现了将所有匹配的“&”字符1:1替换为“%26”的技巧


编辑:对未知的“&”分组的解决方案只需稍加修改即可实现(如果可能有点笨拙)。替换方法的基本模式是无限灵活的

var x = "zipzam&foo&bar&baz?&&&?&&&";

var f = function ($1,$2)
{
  return $2 + ($2=='' || $2.indexOf('?')>-1 ? '&' : '%26')
}

x.replace(/(.*?)&(?=.*?\?)/g,f)

这与您的目标非常接近:-

alert("zipzam&&&?&&&?&&&".replace(/^([^&\?]*)(&*)\?/, function(s, p, m)
{
for (var i = 0; i < m.length; i++) p += '%26';
return  p +'?';
}));
alert(“zipzam&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.”替换(/^([^&&\?]*)(&*)\?/,函数(s,p,m)
{
对于(变量i=0;i
这应该可以做到:

^[^?]*&[^?]*\?
"zip=zam=&=&=&=?&&&?&&&".replace(/^[^?]+/, function(match) { return match.replace(/&/g, "%26"); });

由于OP只想在第一个问号之前匹配ampersands,稍微修改Michael Borgwardt的答案,我得到了这个正则表达式,它似乎是合适的:

^[^?&]*(\&+)\?
将所有匹配项替换为“%26”


这将与zipzam&&abc?&&&&&&&不匹配,因为第一个“?”前面没有一个符号和。

我不确定您将如何使用此模式来实现目标,@will,我认为是匹配组中的“&”。这似乎产生了我想要的结果:alert(“zip=zam&&&=?&&&&&&&&&&&&&&&&&&&&&.”替换(/(&+)(?=.*\?)/,encodeURIComponent));但是,我是否遗漏了什么?@Will-WFM,生成“zipzam%26%26%&&&&”不知道为什么我会得到不同的结果。我向你们鞠躬。@Shadow-不,这对你们来说可能是一个干净的解决方案。在这种情况下,encodeURIComponent方法将获得与上述anon方法相同的结果,因为该方法的第一个参数仍然是匹配的,你们获得了内置处理,但失去了一些灵活性。它是这是一个好主意solution@Will-我只是在我的编辑器中的html页面上运行这个,无法想象为什么你会看到不同的结果?我想我从测试中得到了一些不正确的结果。我正在删除我的所有评论。@Gumbo我想你的最后一个做了。让我再检查一下。@Gumbo谢谢。最后一个做了。如果没有'?'现在,它把所有的&都变成了%26,这也是我想要的。很好的简单半递归解决方案,比我的努力+1:)表现得更好