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

时间:2009-01-26 13:03:13

标签: javascript regex

基本上,我想做“zipzam&&& amp;& amp;&&&&&& - > “zipzam%26%26%26安培;?&安培;&安培;?&安培;&安培;&安培;”。我可以在没有正则表达式的情况下以很多不同的方式做到这一点,但是如果我能用正则表达式做的话,它会清理一些东西。

由于

编辑:“zip = zam&&& =?&&&?&&&&” - > “邮编= ZAM%26%26%26 =&安培;?&安培;&安培;?&安培;&安培;&安培;”应该让事情变得更加清晰。

编辑:“zip = zam =& =& =& =?&&&?&&&&” - > “ZIP = ZAM =%26 = 26%= 26%=&安培;?&安培;&安培;?&安培;&安培;&安培;”应该让事情更清楚。

然而,这些只是一些例子。我仍然想要替换 all '&'在第一个'?'之前无论'&'在哪里是在第一个'?'之前而且无论'&'是否连续。

8 个答案:

答案 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;和停止等。