在 Raku 正则表达式中转义元字符(如 Perl 的 quotemeta() 或 \Q...\E)?

Escaping metacharacters in a Raku regex (like Perl's quotemeta() or \Q...\E)?

如何像使用 Perl 的 quotemeta function (\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 正则表达式中的字符?

您问题的答案:

您可以按字面意义对待 Raku 正则表达式中的字符,方法是用引号将它们括起来(例如,'.*?'),或者使用常规变量插值(例如,$substring 在正则表达式中,其中 $substring 是一个包含元字符的字符串)。

因此,要将带有 \Q...\E 的 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

这会将 .*? 视为文字字符,而不是元字符。如果您想避免使用文字文本而不是变量进行插值,您可以将替换正则表达式更改为 s/quick '.*?' fox/big bad wolf/。相反,如果你想使用 $substring 变量作为正则表达式的一部分(也就是说,如果你 do 希望 .*? 成为元字符)你需要将替换正则表达式更改为 s/<$substring>/big bad wolf/。更多详情,可以参考Rexex interpolation docs.

如何在不等待 SO 的情况下找到这个答案

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

但是 IRC 和 SO 都是异步的——因此您可能需要稍等片刻才能得到答复。与 容易地 快速地 相比,对 Raku 感兴趣的人们经常通过其他方式 good/great 获得问题的答案 133=],此答案的其余部分提供了有关这些方法的一些指导。 (我已经按照我建议的一般顺序对步骤进行了编号,但您没有理由 需要 遵循该顺序)。

比询问 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 didn't 为您解答。因此,在这种情况下,您将采取以下步骤:

第 0 步:查看文档

当然,真正的第一步应该是搜索 Raku docs for anything useful. I bet you did this – the docs currently don't return any relevant results for \Q..\E。事实上,在这些结果中 \Q...\E 唯一真正的正匹配来自 Perl 到 Raku 指南——简而言之 :“使用 String::ShellQuote(因为 \Q…\E 不完全正确)...”。这显然不是你感兴趣的。

文档网站并不总能很好地回答简单的问题。有时,正如我们在 \Q...\E 案例中清楚看到的那样,对于相关搜索词,它根本不会产生 任何答案

第 1 步:搜索堆栈溢出

同样,您可能这样做了,但最好记住:您可以通过在查询中添加 [raku] 来限制标记为与 Raku 相关的 SO 搜索 questions/answers。在这里,[raku] "\Q...\E" 的查询不会产生任何相关的东西——但是,由于你的问题,它在未来会产生 :)

第 2 步:Archived/historical“规范”文档

Raku 的设计主要由拉里·沃尔 (Larry Wall) 在长达 2 年的时间里编写的一系列“规范”文档中编写。

(“specs”一词是“规范推测”的缩写。它是 Raku 语言的超权威详细和精确 spec化,主要由 Larry Wall 本人撰写,和仅仅是 speculations -- 因为它都取决于实施。这两个方面纠缠在一起,现在 out-of-date。所以不要 100% 依赖它们 - - 但也不要忽略它们。)

“规格”,又名设计文档,是一种极好的资源。您可以在 design.raku.org.

的搜索框中输入搜索词,使用 google 搜索它们

搜索 \Q...\E 会列出 7 页。唯一有用的匹配项是 Synopsis 5: Regexes and Rules(“2002 年 6 月 24 日 — \Q$var\E / ...”)。如果我单击它然后执行 in-page 搜索 \Q,我会得到 2 个匹配项,一起回答你的问题(至少在变量方面——他们没有提到文字字符串):

In Raku / $var / is like a Perl / \Q$var\E /

\Q...\E sequences are gone.

第 3 步:IRC 聊天记录

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

在那种情况下,搜索 IRC 日志可能是一个不错的选择(如之前在 Quicker answer 中讨论的那样 部分。 IRC 日志是一个极其丰富的信息宝库,具有出色的搜索功能。请阅读该部分以获得明确的一般指导。

在这种特殊情况下,如果我们 searched for \Q in the old Raku channel,我们就会得到一堆有用的匹配项。前几个 中的 None 完全 回答了你的问题,但如果在上下文中阅读,有几个会回答(或至少使答案清楚)——但需要阅读周围的上下文这让我把搜索 IRC 日志放在前面的步骤下面。

Raku版本:


    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␤

上面,$<> 用作匹配变量 $/ 的别名。 请注意,您可以按如下方式编写第三行(智能匹配)——它给出相同的结果:

    $sentence ~~ s{<$substring>}="big bad wolf";

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