学习Perl的正则表达式实践

zazmityj  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(162)

在阅读 Learning Perl 时,我遇到了一个关于正则表达式的问题。在第9章的练习3中,要求学生使用regex将字符串a替换为另一个字符串b,并将b替换为a,例如:如果a =“杀手”且B =“刺客”,则“杀手谋杀刺客”应修改为“刺客谋杀杀手”。
书中的答案是删除所有的eoln,然后使用eoln作为保持器来处理这种情况,但这种方法似乎很笨拙,也不是普遍适用的。也许有人可以有一个更好的,例如,一行程序,来解决这个问题?

olqngx59

olqngx591#

s/(hitman|assasin)(.+)(hitman|assasin)/$3$2$1/;

或者使用/e修饰符:

s/(hitman|assasin)/$1 eq 'hitman' ? 'assasin' : 'hitman'/eg;

第二个示例检测是否找到了hitman。如果找到,则替换为“assasin”。如果没有找到,则替换为“hitman”。

eh57zj3b

eh57zj3b2#

我会检查单词锚的开头和结尾。

's/\<\([Aa]ssassin\)\>\(.*\)\<\([Hh]itman\)\>/\3\2\1/'

展开是:第二章:对我国现行法律制度的修改与完善
〈和〉是为了确保单词是独立的。(和)是为了将刺客、中间的文本和杀手分别保存到1、2和3。

ruarlubt

ruarlubt3#

非常具体,但很可能适用于这种情况(假设每种情况只有一个示例,并且hitman在assassist之前):

s/^(.*)hitman(.*)assassin(.*)$/$1assassin$2hitman$3/

或者甚至

s/^(.*)(hitman)(.*)(assassin)(.*)$/$1$4$3$2$5/

相关问题