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

cod*_*ons 10 regex escaping modifier quotemeta raku

如何像使用 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
Run Code Online (Sandbox Code Playgroud)

将每个.*、 和?视为元字符,从而打印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 正则表达式中的字符?

cod*_*ons 8

您的问题的答案:

\n

您可以按字面意思处理 Raku 正则表达式中的字符,方法是用引号(例如,\'.*?\')或使用常规变量插值(例如,$substring在正则表达式内部$substring包含元字符的字符串)。

\n

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

\n
my $sentence = \'The quick brown fox jumped over the lazy dog\';\nmy $substring = \'quick.*?fox\';\n$sentence ~~ s/$substring/big bad wolf/;\nprint $sentence\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

你怎么能不等就找到这个答案

\n

当您不知道如何在 Raku 中执行某些操作时该怎么办?在IRC 频道或 Stack Overflow 上提问是一个选项 \xe2\x80\x93 ,并且在 SO 上提出明确的问题的好处是使将来有相同问题的其他人更容易搜索到答案。

\n

但 IRC 和 SO 都是异步的 \xe2\x80\x93 所以你可能需要等待一段时间才能得到答案。对 Raku 感兴趣的人们经常可以通过其他方式比 IRC/SO更轻松、更快速地获得问题的良好/出色答案,本答案的其余部分提供了有关这些方法的一些指导。(我已按照我建议的一般顺序对步骤进行了编号,但您没有理由需要遵循该顺序)。

\n

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

\n

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

\n

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

\n

在这些情况下,Raku 只会告诉您如何做您想做的事情。事实上,\\Q...\\E就是这样一个案例。如果您尝试以 Perl 方式执行此操作

\n
/\\Q$substring\\E/\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
Unsupported use of \\Q as quotemeta.  In Raku please use: quotes or\nliteral variable match.\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

第 0 步:检查文档

\n

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

\n

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

\n

第 1 步:搜索堆栈溢出

\n

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

\n

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

\n

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

\n

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

\n

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

\n
\n

搜索列出了\\Q...\\E7 页。唯一有用的匹配是概要 5:正则表达式和规则(“24 Jun 2002 \xe2\x80\x94 \\Q$var\\E /...”)。如果我单击它,然后进行页内搜索\\Q,我会得到 2 个匹配项,它们一起回答您的问题(至少对于变量 \xe2\x80\x93 ,它们没有提到文字字符串):

\n
\n

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

\n
\n
\n

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

\n
\n

步骤 3:IRC 聊天记录

\n

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

\n

在这种情况下,搜索 IRC 日志可能是一个不错的选择(如之前在过去问题的答案的“更快的答案”部分中讨论的那样)。IRC 日志是一个极其丰富的信息矿藏,具有出色的搜索功能。请阅读该部分以了解更多信息明确的一般指导。

\n

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

\n

  • 请随意在 SO 或其他任何地方重用我的任何 Raku 相关内容,只要您认为合适,在 SO 或其他任何地方重新发布它(例如文档)。按原样重复使用它,或者对其进行编辑,或者将其作为其他东西的一部分而在某种程度上或完全无法识别,这一切都非常好。不需要任何功劳,不过如果你觉得在进行特别实质性的重用后考虑提及我是正确的,这在罕见/吉祥的场合可能会很好。 (2认同)
  • 一个尼特。“我得到了 2 个匹配,它们一起回答了你的问题:”但他们没有,因为他们没有提到使用文字字符串。你真是太不小心了!(好吧,我有罪。) (2认同)
  • FWIW 我原以为我可能应该考虑打破“我如何找到 Raku 问题的答案?” 作为单独的社区问答。但我知道我应该 A) 研究我这样做是否冒着招致 SO mods 愤怒的风险,如果是的话,B) 决定我是否应该继续前进,希望他们没有注意到,或者决定离开它即使它确实违反了关于什么是可接受的 Q 的 SO 准则,或者至少只是关闭它而不是删除它。但现在你已经改进了它,也许会被添加到你的无限待办事项列表而不是我的...... (2认同)
  • 谢谢,@raiph。这是有道理的:社区问答 - 不过,如果您的无限待办事项列表最终[比我的小](https://math.stackexchange),您应该同样自由地重复使用我在创建社区问答时添加的任何内容.com/questions/1406525/comparing-infinities#1406546)。 (2认同)