Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 学习Perl的正则表达式实践_Regex_Perl - Fatal编程技术网

Regex 学习Perl的正则表达式实践

Regex 学习Perl的正则表达式实践,regex,perl,Regex,Perl,在阅读和学习Perl时,我遇到了一个关于正则表达式的问题。在第9章中,练习3要求学生使用正则表达式将字符串a替换为另一个字符串b,并将b替换为a,例如: 如果a='hitman'和b='submitter',则“刺客谋杀了刺客”应修改为“刺客谋杀了刺客” 在本书中,答案是删除所有eoln,然后使用eoln作为占位符来处理这种情况,但这种方法似乎很笨拙,并且不具有普遍适用性。也许有人可以用一个更好的,例如,一行,来解决这个问题 谢谢你们的意见 魏紫瑶 编辑:谢谢你们的意见,但一般的方法会很好的!:

在阅读和学习Perl时,我遇到了一个关于正则表达式的问题。在第9章中,练习3要求学生使用正则表达式将字符串a替换为另一个字符串b,并将b替换为a,例如: 如果a='hitman'和b='submitter',则“刺客谋杀了刺客”应修改为“刺客谋杀了刺客”

在本书中,答案是删除所有eoln,然后使用eoln作为占位符来处理这种情况,但这种方法似乎很笨拙,并且不具有普遍适用性。也许有人可以用一个更好的,例如,一行,来解决这个问题

谢谢你们的意见

魏紫瑶


编辑:谢谢你们的意见,但一般的方法会很好的!:)

非常具体,但可能适用于本案例(考虑到每个案例只有一个,且›杀手è在›阿萨辛è之前):

甚至

s/^(.*)(hitman)(.*)(assasin)(.*)$/$1$4$3$2$5/
或使用/e修改器:

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

第二个例子检测是否找到了杀手。如果是,则替换为“assasan”。如果不是,用“杀手”代替。

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

's/\<\([Aa]ssassin\)\>\(.*\)\<\([Hh]itman\)\>/\3\2\1/'
's/\\(.\\)\/\3\2\1/'
展开的是:s/\<([Aa]ssassin)>(.*)\<([Hh]itman)>/\3\2\1/


\的作用是确保单词是独立的。(和)是为了拯救刺客,文本介于和刺客之间,分别为1、2和3

›删除所有eoln,然后将eoln用作占位符嫀,什么是“eoln”?@knittl行尾。我在几年前写过Pascal:)EOL是有意义的,但是在你的例子中没有EOL(换行符?)不要忘了在a和an之间交换,否则听起来就不对了。@tchrist不是我的错-如果这样做正确,正则表达式就不会这样做:)谢谢你的回复!这个例子在我的帖子中只是一个解释,不过还是要谢谢你。你能给出一个更一般的方法吗?恐怕不行,这就是为什么我提到这是一个非常具体的问题…对不起,谢谢你的回答!也许这个问题在理论上是不可行的?在
$$2
中有什么或者更确切地说,
$hitman
中是什么,因为这就是这里计算的
$$2
:(@tchrist:对不起,我的键盘吞了一个按键。应该是
$3$2
–更新了我的答案
/eg
版本很棒,除了拼写。哇,这就是我所说的正则表达式魔法!
s/(hitman|assasan)/$1 eq 'hitman' ? 'assasan' : 'hitman'/eg;
's/\<\([Aa]ssassin\)\>\(.*\)\<\([Hh]itman\)\>/\3\2\1/'