正则表达式:使用一个正则表达式替换同一行中多次出现的模式

时间:2016-01-13 10:31:19

标签: regex

我试图捕获URL中的%20并用+&替换它们,以及删除其他一些东西,最好都使用单个正则表达式。< / p>

具体来说,我喜欢这样的事情

a%20sentence%20divided%20by%20spaces_123456.html

变成这样的东西

a+sentence+divived+by+spaces

编辑:为清楚起见,%20&和_1233456.html作为目标是至关重要的,最好使用一个表达式。

可以使用

定位来源

^([\w]+%20)+.*\.html$(多次出现[\w]+%20,后跟任何字符,后跟.html

但我对如何专门替换%20和尾随&#39; 123456&#39;的多次出现感到困惑。我猜这将是一个正确方向的镜头

^(([\w]+)%20)+([\w]+)_[0-9]+\.html$

$1每次出现([\w]+)%20$2在第一场比赛中每次出现[\w]+$3[\w]+,但是我没有得到我正在寻找的结果(使用Sublime Text):

string: a%20sentence%20divided%20by%20spaces_123456.html
search: ^(([\w]+)%20)+([\w]+)_[0-9]+\.html$
replace: $2+$3
expected result: a+sentence+divided+by+spaces
actual result: by+spaces

我的思路出错了吗?

2 个答案:

答案 0 :(得分:0)

你可以使用两个正则表达式(虽然可能有更好的解决方案):

var string ="a%20sentence%20divided%20by%20spaces_123456.html";
// replace %20 with +
var regex1 = '%20';
var re1 = new RegExp(regex1, 'g');
string = string.replace(re1, '+');
// trailing _12345
var regex2 = '([^_]+)_([^.]+)(\.html)$';
// match everything except an underscore and capture it in group 1
// underscore
// match everything except a dot
// match the file extension (html in this case) and capture it in group 3
var re2 = new RegExp(regex2);
string = string.replace(re2,'$1$3');
// replace the string with capture group 1 and 3
alert(string);

请在此处查看a JS fiddle

答案 1 :(得分:0)

根据捕获的内容替换不同字符串的字符串部分并不是使用正则表达式轻松完成的。 使用2个正则表达式可以很容易地完成。但是,如果你真的只想用1个正则表达式做这个,这里有一个解决方案

带有1个正则表达式的解决方案:

original_string = 'a%20sentence%20divided%20by%20spaces_123456.html'
searched_string = original_string + "+"
regex : '%20(?=[^\+]*(\+))|_[^_]*$'
replace : '$1'
result : a+sentence+divided+by+spaces

解释:
正则表达式将搜索&#34; %20 &#34;后跟任何以&#34; + &#34;结尾的字符串并捕获&#34; + &#34; 最后一个&#34; _ &#34;之后的每个字符没有捕获任何东西 然后它将用捕获字符串替换匹配的字符串,该字符串是&#34; + &#34;如果&#34; %20 &#34;已匹配,如果它是字符串的结尾,则 为了工作,这个正则表达式需要字符串包含&#34; + &#34;。
这就是为什么你需要在你的字符串末尾连接它(无论如何它都会被正则表达式删除)