8

如何像使用 Perl 的quotemeta 函数( \Q..\E) 一样在 Raku 正则表达式中转义元字符?

也就是 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 正则表达式中逐字处理字符?

4

1 回答 1

6

你的问题的答案:

'.*?'您可以通过用引号将它们括起来(例如, )或使用常规变量插值(例如,$substring在正则表达式中包含元字符的字符串)来逐字处理 Raku 正则表达式中$substring的字符。

因此,要将 Perl 程序\Q...\E从您的问题翻译成 Raku,您可以编写:

my $sentence = 'The quick brown fox jumped over the lazy dog';
my $substring = 'quick.*?fox';
$sentence ~~ s/$substring/big bad wolf/;
print $sentence

这将被.*?视为文字字符,而不是元字符。如果您想避免使用文字而不是变量进行插值,您可以将替换正则表达式更改为s/quick '.*?' fox/big bad wolf/. 相反,如果您想将$substring变量用作正则表达式的一部分(也就是说,如果您确实.*?成为元字符),则需要将替换正则表达式更改为s/<$substring>/big bad wolf/. 有关更多详细信息,您可以查阅Rexex 插值文档

你怎么能在不等待的情况下找到这个答案

当您在 Raku 中不知道如何做某事时该怎么办?在IRC 频道或在 Stack Overflow 上提问是一种选择——在 SO 上问一个明确的 Q 有利于让未来有相同问题的其他人更容易搜索到答案。

但是 IRC 和 SO 都是异步的——所以你可能需要稍等片刻才能得到答案。与从 IRC/SO 相比,对 Raku 感兴趣的人们经常可以通过其他方式更轻松、更快速地获得对他们问题的好/很好的答案,并且此答案的其余部分提供了有关这些方式的一些指导。(我已经按照我推荐的一般顺序对这些步骤进行了编号,但是您没有理由需要遵循该顺序)。

比询问 SO Q 更快地轻松获得更好的答案

步骤-1:让 Raku 为您回答问题

Raku 力求提供令人敬畏的错误消息,有时您会很幸运地以一种不起作用的方式尝试某些事情,但 Raku 可以告诉您您正在尝试做什么。

在这些情况下,Raku 只会告诉你如何做你想做的事。而且,事实上,\Q...\E就是这样一种情况。如果你试图用 Perl 的方式来做

/\Q$substring\E/

您会$substring以以下错误消息的形式得到我上面给出的相同答案(使用或引号):

Unsupported use of \Q as quotemeta.  In Raku please use: quotes or
literal variable match.

所以,有时,Raku 会为您解决问题!但这并不是一直都会发生的事情,而且,任何时候你想问一个 SO 问题时,很可能 Raku没有为你回答你的问题。因此,在这种情况下,您将采取以下步骤:

第 0 步:检查文档

当然,第一步应该是在Raku 文档中搜索任何有用的东西。我敢打赌你这样做了——文档目前不返回任何相关结果\Q..\E。事实上,\Q...\E这些结果中唯一真正的肯定匹配是从Perl 到 Raku 指南 - 简而言之:“使用String::ShellQuote(因为\Q…\E不完全正确)......”。这显然不是你感兴趣的。

docs 网站并不总是能对简单的问题给出很好的答案。有时,正如我们在案例中清楚地看到的那样\Q...\E,它根本不会为相关搜索词提供任何答案。

第 1 步:搜索堆栈溢出

同样,您可能已经这样做了,但请记住:您可以通过添加[raku]到查询来限制标记为与 Raku 相关的 SO 搜索问题/答案。在这里,查询[raku] "\Q...\E"不会产生任何相关信息——但是,多亏了你的问题,它会在未来:)

第 2 步:存档/历史“规范”文档

Raku 的设计是由主要由 Larry Wall 在 20 年期间编写的一系列“规范”文档编写的。

(“规范”这个词是“规范推测”的缩写。它是 Raku 语言的超权威详细和精确规范,主要由拉里沃尔本人撰写,也仅仅是推测——因为它都需要实施。而且这两个方面被纠缠在一起,现在已经过时了。所以不要100%依赖它们——但也不要忽视它们。)

“规格”,又名设计文档,是一个很棒的资源。您可以通过在design.raku.org的搜索框中输入搜索词来使用 google 搜索它们。


搜索\Q...\E列表 7 页。唯一有用的匹配是概要 5:正则表达式和规则(“2002 年 6 月 24 日 — \Q$var\E /...”)。如果我单击它然后在页面内搜索\Q,我会得到 2 个匹配项,它们一起回答您的问题(至少在变量方面——它们没有提到文字字符串):

在 Raku/ $var /中就像一个 Perl/ \Q$var\E /

\Q...\E序列消失了。

第 3 步:IRC 聊天记录

在这种情况下,搜索设计文档可以回答您的问题。但是如果它没有/我们不明白答案怎么办?

在这种情况下,搜索 IRC 日志可能是一个不错的选择(如之前在对过去 Q 的答案的快速回答部分中所讨论的那样。IRC日志是一个非常丰富的信息矿,具有出色的搜索功能。请阅读该部分以了解明确的一般指导。

在这种特殊情况下,如果我们在旧的 Raku 频道中进行搜索\Q,我们会得到一堆有用的匹配项。前几个都没有完全回答您的问题,但如果在上下文中阅读,有几个确实(或至少使答案清楚) - 但正是需要阅读周围的上下文,这使我将搜索 IRC 日志放在前面的步骤之下。

于 2022-02-09T22:30:27.340 回答