Regex 正则表达式替换开括号

Regex 正则表达式替换开括号,regex,perl,parentheses,Regex,Perl,Parentheses,作为解析脚本的一部分,我尝试转换如下字符串: <a href="http://www.web.com/%20Special%20event%202013%20%282%29.pdf"> 给我 <a href="http://www.web.com/%20Special%20event%202013%20%282).pdf"> 只返回两个组,中间没有任何内容: <a href="http://www.web.com/%20Special%20event%2

作为解析脚本的一部分,我尝试转换如下字符串:

<a href="http://www.web.com/%20Special%20event%202013%20%282%29.pdf">
给我

    <a href="http://www.web.com/%20Special%20event%202013%20%282).pdf">
只返回两个组,中间没有任何内容:

<a href="http://www.web.com/%20Special%20event%202013%202%29.pdf">
输出

<a href="http://www.web.com/%20Special%20event%202013%20(2%29.pdf">


有人能理解这一点吗。

也许下面的内容会有所帮助,或者至少提供一些指导。它将在Perl版本10及更高版本上工作

use strict;
use warnings;
use v5.10.0; # For regex \K

use URI::Escape;

my $string = '<a href="http://www.web.com/%20Special%20event%202013%20%282%29.pdf">';
$string =~ s/.+2013%20\K([^.]+)(?=\.pdf)/uri_unescape($1)/e;
print $string;
使用严格;
使用警告;
使用v5.10.0;#对于正则表达式\K
使用URI::Escape;
我的$string='';
$string=~s/+2013%20\K([^.]+)(?=\.pdf)/uri\u unescape($1)/e;
打印$string;
输出:

<a href="http://www.web.com/%20Special%20event%202013%20(2).pdf">


留下足够的日期和空格(
%20
)作为锚定,然后使用
\K
来*K*保留所有这些。然后捕获URI编码的文本,稍后将其解码并用作替换文本。

以下内容可能会有所帮助,或者至少提供一些指导。它将在Perl版本10及更高版本上工作

use strict;
use warnings;
use v5.10.0; # For regex \K

use URI::Escape;

my $string = '<a href="http://www.web.com/%20Special%20event%202013%20%282%29.pdf">';
$string =~ s/.+2013%20\K([^.]+)(?=\.pdf)/uri_unescape($1)/e;
print $string;
使用严格;
使用警告;
使用v5.10.0;#对于正则表达式\K
使用URI::Escape;
我的$string='';
$string=~s/+2013%20\K([^.]+)(?=\.pdf)/uri\u unescape($1)/e;
打印$string;
输出:

<a href="http://www.web.com/%20Special%20event%202013%20(2).pdf">


留下足够的日期和空格(
%20
)作为锚定,然后使用
\K
来*K*保留所有这些。然后捕获URI编码的文本,稍后将其解码并用作替换文本。

我在理解您的正则表达式时遇到一些问题,但这可能会起作用:

 perl -pe "s~(href\s*=\s*\"[^\"]*)%28(.*?)%29~\$1(\$2)~g" input

我在理解您的正则表达式时遇到一些问题,但这可能会起作用:

 perl -pe "s~(href\s*=\s*\"[^\"]*)%28(.*?)%29~\$1(\$2)~g" input

您的模式与显示的字符串完全不匹配。它和看起来像

<a href=/"../$i-xxxxxxxxxxxxxxx%29xxxxxxxxxx">
但它仍然不能“很好地工作”与你给的字符串,这将不得不看起来像

<a href=/"../$i-xxxxxxxxxxxxxxx%282%29xxxxxxxxxx">
s/(href="[^"]+)%28(\d+)%29(\.pdf")/$1($2)$3/;

它可以很好地处理您给定的字符串,并立即替换开括号和闭括号。

您的模式与您显示的字符串完全不匹配。它和看起来像

<a href=/"../$i-xxxxxxxxxxxxxxx%29xxxxxxxxxx">
但它仍然不能“很好地工作”与你给的字符串,这将不得不看起来像

<a href=/"../$i-xxxxxxxxxxxxxxx%282%29xxxxxxxxxx">
s/(href="[^"]+)%28(\d+)%29(\.pdf")/$1($2)$3/;

它对您提供的字符串很有效,并同时替换了开括号和闭括号。

感谢您的回答,原来问题出在我的脚本的其他地方(另一个替换是删除parentesis)-但是\K是一个方便的运算符,可以添加到库中。感谢您的回答,原来问题出在我的脚本的其他地方(另一个替换是删除parentesis)-但是\K是一个方便的操作符,可以添加到库中。谢谢。这些都是很好的一般建议。在这里发布之前,我曾试图简化这个问题,但很明显,我没有抓住要点。我回去进一步清理了问题,添加了更多的调试,并最终将问题追溯到脚本中的另一个流氓替换,以澄清两点:$I是一个变量,因为它位于shell脚本中。第二,我知道可选的斜杠不是有效的HTML,我只是想适应WYSISYG编辑器所产生的任何东西。最终,尽管你给我的批判性评估让我有了正确的心态,回去重新评估情况几次,直到我理解为止。谢谢我推测,
$I
是一个shell变量,但我无法使您的正则表达式与您声称匹配的字符串相一致。我尝试的任何与第一个模式匹配的字符串都将与第二个模式匹配,因此我无法复制您的问题。这里有一个很好的例子,可以将整个过程写成一个Perl脚本,而不是一个不祥的shell和Perl的混合体,在这种混合体中,没有人知道应该有多少反斜杠。Perl比任何shell都更加通用,您应该集中精力彻底学习它。是的。完全同意@Borodin。该项目的范围已经从一个合理的小shell脚本扩展到需要重写的beast。很抱歉,我给你的输入在脚本中得到了进一步修改,当这个替换发生时,它看起来更像:href=“../$I-community\u events/%20Special%20event\u 2013\u%282%29.pdf”很公平。但你说你现在在正确的轨道上,这是最重要的。如果您感兴趣,我的服务可用于迁移。在这里询问,我将发布一个临时电子邮件地址。否则我祝你一切顺利。谢谢。这些都是很好的一般建议。在这里发布之前,我曾试图简化这个问题,但很明显,我没有抓住要点。我回去进一步清理了问题,添加了更多的调试,并最终将问题追溯到脚本中的另一个流氓替换,以澄清两点:$I是一个变量,因为它位于shell脚本中。第二,我知道可选的斜杠不是有效的HTML,我只是想适应WYSISYG编辑器所产生的任何东西。最终,尽管你给我的批判性评估让我有了正确的心态,回去重新评估情况几次,直到我理解为止。谢谢我推测,
$I
是一个shell变量,但我无法使您的正则表达式与您声称匹配的字符串相一致。我尝试的任何与第一个模式匹配的字符串都将与第二个模式匹配,因此我无法复制您的问题。这里有一个很好的例子,可以将整个过程写成一个Perl脚本,而不是一个不祥的shell和Perl的混合体,在这种混合体中,没有人知道应该有多少反斜杠。Perl比任何shell都更加通用,您应该集中精力彻底学习它。是的。完全同意@Borodin。该项目的范围已经从一个合理的小shell脚本扩展到需要重写的beast。很抱歉,我给你的输入在脚本中得到了进一步修改,当这个替换发生时,它看起来更像:href=“../$I-community\u events/%20Special%20event\u 2013\u%282%29.pdf”很公平。但是你说你现在在正确的轨道上