Regex практика от изучения Perl - PullRequest
2 голосов
/ 21 апреля 2011

Читая Learning Perl, я столкнулся с проблемой регулярных выражений.В главе 9 в упражнении 3 студент просит использовать регулярное выражение для замены строки a другой строкой b и замены b на a, например: если a = 'hitman' и b = 'assassin', то 'киллер убил убийцу'следует изменить на «Убийца, убивший наемного убийцу».

В книге ответ состоит в том, чтобы удалить все eoln, а затем использовать eoln в качестве заполнителя для решения этой ситуации, но этот метод кажется неуклюжими не является универсально применимым.Может быть, у кого-то может быть лучше, например, однострочник, чтобы решить этот вопрос?

Спасибо, ребята, за любые вклады!

Ziyao Wei

Редактировать: Спасиборебята за вклад, но общий подход был бы отличным! :) 1009 *

Ответы [ 3 ]

4 голосов
/ 21 апреля 2011
s/(hitman|assasin)(.+)(hitman|assasin)/$3$2$1/;

Или с помощью модификатора / e:

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

Этот второй пример определяет, был ли найден киллер. Если так, замените «ассасан». Если нет, замените «наемный убийца».

0 голосов
/ 24 октября 2011

Я бы проверил начало и конец якоря слова.

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

разбросано: s / \ <([Aa] ssassin)> (. *) \ <([Hh] итман)> / \ 3 \ 2 \ 1 /

\ <и> должны убедиться, что слово само по себе. (И) - сохранить ассасина, промежуточный текст и киллера в 1, 2 и 3 соответственно.

0 голосов
/ 21 апреля 2011

очень специфично, но, вероятно, сработает для этого случая (учитывая, что каждый экземпляр только один, и ›hitman‹ предшествует ›assasin‹):

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

или даже

s/^(.*)(hitman)(.*)(assasin)(.*)$/$1$4$3$2$5/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...