2011-04-21 4 views
2

Learning Perl을 읽는 동안 정규식에 관한 문제가 발생했습니다. 9 장에서 연습 문제 3은 a를 'a hitman'과 b = 'assassin'이라고하면 과 같이 문자열 a를 다른 문자열 b로 대체하고 b를 a로 바꿀 수있는 정규식을 사용한 다음 '암살자가 암살자를 살해했다. '는'암살자가 살인 청부 업 자 '로 변경되어야합니다.Regex practice from Perl

책에서 대답은 모든 eoln을 삭제 한 다음 eoln을이 상황을 처리하기위한 자리 표시 자로 사용하는 것이지만이 방법은 어색하고 보편적으로 적용 할 수없는 것입니다. 이 문제를 해결하기 위해 누군가가 더 나은 예를 들어, 한 - 라이너를 가질 수 있습니까?

의견을 보내 주셔서 감사합니다.

Ziyao 웨이

편집 :! 입력을 위해 너희들을 감사하지만, 일반적인 접근 방식 :

+0

> 모든 ** eoln **을 삭제 한 다음 eoln을 장소 소유자로 사용합니다. <, "eoln"은 무엇입니까? – knittl

+0

@knittl end of line. 나는 년 전에 파스칼을 썼다. –

+0

EOL은 의미가 있지만 예제에는 EOL (줄 바꿈)이 없다. – knittl

답변

4
01 2,

또는/E 개질제를 사용 : 두 번째 예는 공격수가 발견되었는지 여부를 감지 한

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

. 그렇다면 'assasan'을 사용하십시오. 그렇지 않다면 '히트맨'으로 대체하십시오.

+1

맞춤법 검사를 제외하고'/ eg' 버전이 좋습니다. – aschepler

+0

와우 그것이 내가 정규 표현식 마법사라고 부르는 것입니다! –

0

매우 구체적인 좋은 것, 그러나 아마이 경우에 작동합니다 (하나가 주어진 예를 각각> 암살자는 <어쌔신 (암살자) <)> 전에 제공 :

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

또는

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

답장을 보내 주셔서 감사합니다! 이 예제는 내 게시물의 설명 역할을하지만 그래도 감사합니다. 보다 일반적인 접근 방식을 줄 수 있습니까? –

+0

나는 두렵다. 그게 내가이 질문에 매우 구체적이라는 것을 언급 한 이유 다. 미안. – knittl

+0

답장을 보내 주셔서 감사합니다. 어쩌면이 문제는 이론적으로 가능하지 않을까요? –

0

단어 앵커의 시작과 끝을 확인합니다. . (*) S/\ < ([의 AA] ssassin)> < ([Hh를] itman) \>/\ 3 \ 2 \ 1/

의 \ < :

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

이다 퍼져 그리고> 그 단어가 그 자체에 있는지 확인하는 것입니다. (와)는 어쌔신, 사이에있는 텍스트 및 히트맨을 각각 1, 2 및 3으로 저장하는 것입니다.