Экранирование метасимволов в регулярном выражении 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

Это будет рассматриваться как буквальные символы, а не как метасимволы. Если вы хотите избежать интерполяции с литеральным текстом, а не с переменной, вы можете изменить регулярное выражение замены на . И наоборот, если вы хотите использовать переменную как часть регулярного выражения ( т . чтобы быть метасимволами) вам нужно изменить регулярное выражение замены на . Для получения более подробной информации вы можете обратиться к документации по интерполяции Rexex .

Как вы могли найти этот ответ, не дожидаясь 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 г. — ..."). Если я нажму на нее, а затем выполню поиск на странице, я получу 2 совпадения, которые вместе отвечают на ваш вопрос (по крайней мере, в отношении переменных - они не упоминают буквальные строки):

В Раку это как перл / \Q$var\E /

последовательности исчезли.

Шаг 3: Журналы чата IRC

В этом случае поиск в документации по дизайну дал ответ на ваш вопрос. Но что, если бы он не/мы не поняли ответа?

В этом случае поиск в журналах 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";

https://docs.raku.org/language/regexes#Regex_interpolation

Другие вопросы по тегам