Из того, что я могу почерпнуть из документации Pharo на регулярное выражение, я могу определить объект регулярного выражения, такие как:Захват строки в замене регулярных выражений
re := '(foo|re)bar' asRegex
И я могу заменить совпадающий регулярное выражение со строкой через это:
re copy: 'foobar blah rebar' replacingMatchesWith: 'meh'
Это приведет к: «meh blah meh».
До сих пор так хорошо. Но я хочу заменить 'bar'
и оставить префикс в покое. Поэтому, мне нужна переменная для обработки захваченный: в скобках
re copy: 'foobar blah rebar' replacingMatchesWith: '%1meh'
И я хочу результат: 'foomeh blah remeh'
. Однако это просто дает мне: '%1meh blah %1meh'
. Я также пробовал использовать \1
или \\1
, или $1
, или {1}
и получил замену литерала, , например., '\1meh blah \1meh'
в результате.
я могу сделать это достаточно легко в GNU Smalltalk с:
'foobar blah rebar' replacingAllRegex: '(foo|re)bar' with: '%1meh'
Но я нигде не могу найти в документации регулярных выражений Pharo, который говорит мне, как я могу это сделать в Pharo. Я сделал кучу googling для регулярного выражения Pharo, но ничего не понял. Является ли эта возможность частью класса RxMatcher или некоторого другого класса регулярных выражений Pharo?
кажется Pharo не поддерживает замену с захватом группы – rock321987
Ну, вы пробовали обычные стили ссылочности? Как '\ 1', или' \\ 1' или '$ 1' (возможно, с' matchesReplacedWith')? Группы захвата поддерживаются, это ясно из того, что может быть выполнено в Pharo, но нет никакого намека на то, поддерживаются ли обратные ссылки как части шаблонов замены. –
@ WiktorStribiżew Да, я пробовал '\ 1',' \\ 1' и '$ 1'. В каждом случае заменой была буквальная строка. Я обновил свой вопрос, указав эти попытки. Я вижу, что группы захвата поддерживаются, насколько подходит. В документации есть примеры для захвата и перечисления захватов. Тем не менее, ничего о обратном обращении с ними в заменяющей строке. Это кажется фундаментальным для поиска/замены регулярных выражений, поэтому я удивлен, что он не поддерживается. – lurker