Экранирование метасимволов в регулярном выражении Raku (например, Perl quotemeta() или \Q...\E)?
Как я могу экранировать метасимволы в регулярном выражении Raku так же, как в Perl-функции кавычек (
\Q..\E
)?
То есть код Perl
my $sentence = 'The quick brown fox jumped over the lazy dog';
my $substring = 'quick.*?fox';
$sentence =~ s{$substring}{big bad wolf};
print $sentence
относится к каждому из
.
,
*
, а также
?
как метасимволы и, таким образом, печатает
The big bad wolf jumped over the lazy dog
. Но если я изменю предпоследнюю строку на
$sentence =~ s{\Q$substring\E}{big bad wolf};
, то Perl обрабатывает
.*?
как буквальные символы и, таким образом, печатает
The quick brown fox jumped over the lazy dog
.
Как я могу обрабатывать символы буквально в регулярном выражении Raku?
2 ответа
Ответ на ваш вопрос:
Вы можете обращаться с символами в регулярном выражении Raku буквально, заключая их в кавычки (например,
Таким образом, чтобы перевести программу Perl из вашего вопроса в Raku, вы можете написать:
my $sentence = 'The quick brown fox jumped over the lazy dog';
my $substring = 'quick.*?fox';
$sentence ~~ s/$substring/big bad wolf/;
print $sentence
Это будет рассматриваться как буквальные символы, а не как метасимволы. Если вы хотите избежать интерполяции с литеральным текстом, а не с переменной, вы можете изменить регулярное выражение замены на
Как вы могли найти этот ответ, не дожидаясь SO
Что делать, если вы не знаете, как что-то сделать в Раку? Можно задать вопрос либо на канале IRC, либо здесь, на Stack Overflow, и задать четкий вопрос о SO имеет то преимущество, что ответ будет более доступным для поиска для всех, у кого в будущем возникнет такой же вопрос.
Но и IRC, и SO являются асинхронными, поэтому вам, вероятно, придется немного подождать ответа. Есть и другие способы, которыми люди, заинтересованные в Раку, часто получают хорошие / отличные ответы на свои вопросы легче и быстрее , чем они могли бы из IRC / SO, и оставшаяся часть этого ответа дает некоторые рекомендации по этим способам. (Я пронумеровал шаги в общем порядке, который я бы рекомендовал, но нет причин, по которым вам нужно следовать этому порядку).
Легко получить лучшие ответы быстрее, чем задавать вопросы SO
Шаг -1: Позвольте Раку ответить на вопрос за вас.
Раку старается создавать потрясающие сообщения об ошибках, и иногда вам посчастливится попробовать что-то, что не работает, но где Раку может сказать, что вы пытались сделать.
В этих случаях Раку просто скажет вам, как сделать то, что вы хотели сделать. И, собственно, один такой случай. Если бы вы попытались сделать это в стиле Perl
/\Q$substring\E/
вы бы получили тот же ответ, что я дал выше (используйте
Unsupported use of \Q as quotemeta. In Raku please use: quotes or
literal variable match.
Так что иногда Раку решит проблему за вас! Но это не то, что будет происходить постоянно, и каждый раз, когда вы испытываете искушение задать ТАКОЙ вопрос, можно поспорить, что Раку не ответил на ваш вопрос за вас. Итак, вот шаги, которые вы предпримете в этом случае:
Шаг 0: проверьте документы
Первым верным шагом, конечно же, должен быть поиск чего- нибудь полезного в документах Раку .Бьюсь об заклад, вы сделали это - документы в настоящее время не возвращают никаких релевантных результатов для
\Q..\E
. На самом деле, единственное верное совпадение в этих результатах — это руководство Perl to Raku — в двух словах : «использование
Веб-сайт документации не всегда дает хороший ответ на простые вопросы. Иногда, как мы ясно видим на примере, это вообще не дает никакого ответа на соответствующий поисковый запрос.
Шаг 1: Поиск переполнения стека
Опять же, вы, вероятно, сделали это, но хорошо иметь в виду: вы можете ограничить свои поисковые вопросы / ответы SO, помеченные как связанные с Раку, добавив
Шаг 2: Архивные/исторические «специальные» документы
Дизайн Раку был описан в серии «специальных» документов, написанных в основном Ларри Уоллом в течение двух десятилетий.
(Слово «спецификации» — это сокращение от «спекуляции по спецификациям». Это одновременно и сверхавторитетные подробные и точные спецификации языка раку, автором которых в основном является сам Ларри Уолл, и просто предположения — потому что все они подлежали реализации. И эти два аспекта остались запутанными и теперь устарели, так что не полагайтесь на них на 100%, но и не игнорируйте их .)
«Спецификации», также известные как проектная документация, — фантастический ресурс. Вы можете найти их с помощью Google, введя условия поиска в поле поиска на странице design.raku.org.
Поиск по спискам 7 страниц. Единственное полезное совпадение — Synopsis 5: Regexes and Rules («24 июня 2002 г. —
В Раку
это как перл / \Q$var\E /
последовательности исчезли.
Шаг 3: Журналы чата IRC
В этом случае поиск в документации по дизайну дал ответ на ваш вопрос. Но что, если бы он не/мы не поняли ответа?
В этом случае поиск в журналах IRC может быть отличным вариантом (как обсуждалось ранее в разделе « Быстрые ответы » ответа на прошлый вопрос . Журналы IRC — невероятно богатая информация с выдающимися функциями поиска. Пожалуйста, прочтите этот раздел для четкое общее руководство.
В этом конкретном случае, если бы мы искали
Версия Раку :
my $sentence = 'The quick brown fox jumped over the lazy dog';
my $substring = 'quick .*? fox';
$sentence ~~ s/<$substring>/big bad wolf/;
say $<>; #returns: 「quick brown fox」
put $sentence; #returns: The big bad wolf jumped over the lazy dog
Выше,
$<>
используется как псевдоним для
$/
, переменная соответствия. Обратите внимание, что вы можете написать третью строку (smartmatching) следующим образом – она дает тот же результат(ы):
$sentence ~~ s{<$substring>}="big bad wolf";