2011-04-21 36 views
2

在學習Perl時,我遇到了一個關於正則表達式的問題。在第9章中,練習3要求學生使用正則表達式將字符串a替換爲另一個字符串b,並用a代替b,例如:如果a ='hitman'和b ='assassin',則爲' ,然後'一名殺手殺害了一名刺客'應該修改爲'刺客謀殺一名殺手'。學習Perl的正則表達式練習

在這本書中,答案是刪除所有eoln,然後使用eoln作爲佔位符來處理這種情況,但是這種方法似乎很笨拙並且並不普遍適用。也許有人可以有一個更好的,例如,一個班輪,來解決這個問題?

謝謝大家的任何意見!

Ziyao衛

編輯:謝謝你們的投入,但一般的做法將是巨大的:)

+0

>刪除所有** eoln **然後使用eoln作爲佔位符<,什麼是「eoln」? – knittl 2011-04-21 19:07:52

+0

@ knittl行尾。我在幾年前編寫了Pascal :) – 2011-04-21 19:18:10

+0

EOL很有意義,但在示例中沒有EOL(換行符?) – knittl 2011-04-21 19:20:03

回答

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

或者使用/ e改性劑:

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

即第二示例檢測殺手是否被發現。如果是這樣,用'assasan'替代。如果不是,用'殺手'代替。

+1

'/ eg'版本很棒,除了拼寫。 – aschepler 2011-04-21 19:45:15

+0

哇,這就是我稱之爲正則表達式的魔力! – 2011-04-21 19:49:44

0

非常具體的,但應該會很適合這種情況下工作(因爲只有一個實例中的每個和>殺手<到來之前>刺客<):

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

甚至

s/^(.*)(hitman)(.*)(assasin)(.*)$/$1$4$3$2$5/ 
+0

謝謝你的答覆!這個例子只在我的文章中作爲解釋,但是謝謝你。你能給一個更一般的方法嗎? – 2011-04-21 19:23:07

+0

恐怕不是,這就是爲什麼我提到這是非常具體的這個問題...對不起 – knittl 2011-04-21 19:26:57

+0

謝謝你一樣的答覆!也許這個問題在理論上是不可行的? – 2011-04-21 19:35:17

0

我會檢查字錨的開始和結束。

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

展開爲:(。*)S/\ <([AA] ssassin)> \ <([HH] itman)>/\ 3 \ 2 \ 1/

的\ <和>是要確保這個詞是獨立的。 (和)將刺客,中間的文字和殺手分別保存到1,2和3。