首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换没有像我期望的那样工作

替换没有像我期望的那样工作
EN

Stack Overflow用户
提问于 2013-06-08 10:26:58
回答 5查看 103关注 0票数 1

我正在尝试编写一个Perl脚本,它将更改如下所示的代码行……

代码语言:javascript
复制
<li><em>01 &#8211; Chapters 1-4</em> &#8211; 00:14:36 <br />

..。让它看起来像这样。

代码语言:javascript
复制
01 &#8211; Chapters 1-4

..。没什么大不了的,对吧?我只是在我的Perl脚本中做\(.*\)的事情,如下所示:

代码语言:javascript
复制
#!/usr/bin/perl -w
use strict;

while(<DATA>) {
        my $line = $_;
        chomp($line);
        if ( $line =~ /^<li>/ ) {
                $line =~ s/<em>\(.*\)<\/em>/$1/g;
                print "[" . $line . "]\n";
        }
}
__DATA__
<li><em>01 &#8211; Chapters 1-4</em> &#8211; 00:14:36 <br />
<li><em>02 &#8211; Chapters 5-8</em> &#8211; 00:10:52 <br />
<li><em>03 &#8211; Chapters 9-14</em> &#8211; 00:19:16 <br />
<li><em>04 &#8211; Chapters 15-18</em> &#8211; 00:13:30 <br />
<li><em>05 &#8211; Chapters 19-22</em> &#8211; 00:17:01 <br />
<li><em>06 &#8211; Chapters 23-25</em> &#8211; 00:16:44 <br />
<li><em>07 &#8211; Chapter 26</em> &#8211; 00:10:35 <br />
red@ubuntu:~/scripts$ ./test.pl

当我运行脚本时,我得到了这个输出...

代码语言:javascript
复制
[<li><em>01 &#8211; Chapters 1-4</em> &#8211; 00:14:36 <br />]
[<li><em>02 &#8211; Chapters 5-8</em> &#8211; 00:10:52 <br />]
[<li><em>03 &#8211; Chapters 9-14</em> &#8211; 00:19:16 <br />]
[<li><em>04 &#8211; Chapters 15-18</em> &#8211; 00:13:30 <br />]
[<li><em>05 &#8211; Chapters 19-22</em> &#8211; 00:17:01 <br />]
[<li><em>06 &#8211; Chapters 23-25</em> &#8211; 00:16:44 <br />]
[<li><em>07 &#8211; Chapter 26</em> &#8211; 00:10:35 <br />]

..。我在这里做错了什么?

谢谢

更新:

感谢您的回复。他们非常有帮助。我已经把我的代码改成了这个...

代码语言:javascript
复制
red@ubuntu:~/scripts$ cat test.pl
#!/usr/bin/perl -w
use strict;

while(<DATA>) {
        my $line = $_;
        chomp($line);
        if ( $line =~ /^<li>/ ) {
                $line =~ s/<em>(.*)<\/em>/$1/g;
                print "[" . $line . "]\n";
        }
}
__DATA__
<li><em>01 &#8211; Chapters 1-4</em> &#8211; 00:14:36 <br />
<li><em>02 &#8211; Chapters 5-8</em> &#8211; 00:10:52 <br />
<li><em>03 &#8211; Chapters 9-14</em> &#8211; 00:19:16 <br />
<li><em>04 &#8211; Chapters 15-18</em> &#8211; 00:13:30 <br />
<li><em>05 &#8211; Chapters 19-22</em> &#8211; 00:17:01 <br />
<li><em>06 &#8211; Chapters 23-25</em> &#8211; 00:16:44 <br />
<li><em>07 &#8211; Chapter 26</em> &#8211; 00:10:35 <br />

..。但仍然没有达到我想要的输出,我得到了这个。

代码语言:javascript
复制
red@ubuntu:~/scripts$ ./test.pl
[<li>01 &#8211; Chapters 1-4 &#8211; 00:14:36 <br />]
[<li>02 &#8211; Chapters 5-8 &#8211; 00:10:52 <br />]
[<li>03 &#8211; Chapters 9-14 &#8211; 00:19:16 <br />]
[<li>04 &#8211; Chapters 15-18 &#8211; 00:13:30 <br />]
[<li>05 &#8211; Chapters 19-22 &#8211; 00:17:01 <br />]
[<li>06 &#8211; Chapters 23-25 &#8211; 00:16:44 <br />]
[<li>07 &#8211; Chapter 26 &#8211; 00:10:35 <br />]

..。看起来<em></em>被删除了,但我只想要<em></em>之间的文本。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-06-08 10:51:17

您将只替换与更新版本中匹配的那部分行。

代码语言:javascript
复制
print "[$1]\n" if /<em>(.*)<\/em>/;

将只提供(.*)捕获组捕获的内容。这样你就不需要费心去做替换了。

但一定要注意安迪·莱斯特在评论中的谨慎。这可以很好地处理您的测试数据,但是HTML会破坏您的regexp而臭名昭著,特别是当您说出神奇的短语“但我真正的HTML数据将始终以这种形式出现”时。

票数 6
EN

Stack Overflow用户

发布于 2013-06-08 10:51:38

您正在使用与()匹配的\(.*\)。使用(.*)提取匹配项。

http://ideone.com/UTFDZo

根据您的update...you需要使用以下内容

$line =~ s/<em>(.*)<\/em>(.*)/$1/g;

http://ideone.com/AkJtIo

我强烈建议你考虑加入@AndyLester的评论。

票数 3
EN

Stack Overflow用户

发布于 2013-06-08 10:35:10

如果您想要捕获,您需要

代码语言:javascript
复制
 (...)

转义的括号尝试匹配括号。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16995416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档