基本上,我想做“zipzam&&& amp;& amp;&&&&&& - > “zipzam%26%26%26安培;?&安培;&安培;?&安培;&安培;&安培;”。我可以在没有正则表达式的情况下以很多不同的方式做到这一点,但是如果我能用正则表达式做的话,它会清理一些东西。
由于
编辑:“zip = zam&&& =?&&&?&&&&” - > “邮编= ZAM%26%26%26 =&安培;?&安培;&安培;?&安培;&安培;&安培;”应该让事情变得更加清晰。
编辑:“zip = zam =& =& =& =?&&&?&&&&” - > “ZIP = ZAM =%26 = 26%= 26%=&安培;?&安培;&安培;?&安培;&安培;&安培;”应该让事情更清楚。
然而,这些只是一些例子。我仍然想要替换 all '&'在第一个'?'之前无论'&'在哪里是在第一个'?'之前而且无论'&'是否连续。
答案 0 :(得分:4)
这应该这样做:
"zip=zam=&=&=&=?&&&?&&&".replace(/^[^?]+/, function(match) { return match.replace(/&/g, "%26"); });
答案 1 :(得分:3)
你需要负面的外观,这在JS中很难复制,但幸运的是有方法和手段:
var x = "zipzam&&&?&&&?&&&";
x.replace(/(&+)(?=.*?\?)/,function ($1) {for(var i=$1.length, s='';i;i--){s+='%26';} return s;})
评论:这是有效的,因为它不全局。因此,第一场比赛是给定的,并且替换所有匹配的“&”的技巧。使用函数循环
实现“%26”的字符1:1编辑:针对“&”的未知分组的解决方案可以通过一点修改简单地实现(如果可能有点笨拙)。替代方法的基本模式是无限灵活的。
var x = "zipzam&foo&bar&baz?&&&?&&&";
var f = function ($1,$2)
{
return $2 + ($2=='' || $2.indexOf('?')>-1 ? '&' : '%26')
}
x.replace(/(.*?)&(?=.*?\?)/g,f)
答案 2 :(得分:1)
这应该这样做:
^[^?]*&[^?]*\?
答案 3 :(得分:1)
在这种情况下,正则表达式确实不是最适合使用的东西。简单搜索'?'的第一个索引然后替换每个'&'性格最好。但是,如果你真的想要一个正则表达式,那么这应该可以胜任。
(?:.*?(&))*?\?
答案 4 :(得分:1)
或者这个,我想:
^[^?]*(&+?)\?
答案 5 :(得分:1)
这足够接近你所追求的目标: -
alert("zipzam&&&?&&&?&&&".replace(/^([^&\?]*)(&*)\?/, function(s, p, m)
{
for (var i = 0; i < m.length; i++) p += '%26';
return p +'?';
}));
答案 6 :(得分:1)
由于OP只想在第一个问号之前匹配&符号,略微修改Michael Borgwardt的答案给了我这个正则表达式似乎是合适的:
^[^?&]*(\&+)\?
将所有匹配替换为“%26”
这与 zipzam&amp;&amp; abc?&amp;&amp;&amp;?&amp;&amp;&amp;&amp; 不匹配,因为第一个“?”在它之前没有一个&符号。
答案 7 :(得分:-1)
就javascript部分而言,我无法回答这个问题。但我可以给你一个正则表达式,分别匹配每个'&amp;'在第一个文本之后和第一个'?'之前
(?<!\?.{0,2})&+?
从人的角度来说,这是:
尽可能少地匹配'?','?X'或'?XX',其中X是任何字符。
它只匹配'&amp;',因此它不匹配文本的初始位中的任何内容。这是一个非贪婪的比赛(+?)所以它匹配第一个&amp;并停止,然后匹配第二个&amp;和停止等。