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 正则表达式中的字符?
您可以按字面意思处理 Raku 正则表达式中的字符,方法是用引号(例如,\'.*?\'
)或使用常规变量插值(例如,$substring
在正则表达式内部$substring
包含元字符的字符串)。
\\Q...\\E
因此,要将问题中的Perl 程序翻译成 Raku,您可以编写:
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 插值文档。
当您不知道如何在 Raku 中执行某些操作时该怎么办?在IRC 频道或 Stack Overflow 上提问是一个选项 \xe2\x80\x93 ,并且在 SO 上提出明确的问题的好处是使将来有相同问题的其他人更容易搜索到答案。
\n但 IRC 和 SO 都是异步的 \xe2\x80\x93 所以你可能需要等待一段时间才能得到答案。对 Raku 感兴趣的人们经常可以通过其他方式比 IRC/SO更轻松、更快速地获得问题的良好/出色答案,本答案的其余部分提供了有关这些方法的一些指导。(我已按照我建议的一般顺序对步骤进行了编号,但您没有理由需要遵循该顺序)。
\nRaku 努力提供令人敬畏的错误消息,有时您会很幸运地尝试一些不起作用的方法,但 Raku 可以告诉您您正在尝试做什么。
\n在这些情况下,Raku 只会告诉您如何做您想做的事情。事实上,\\Q...\\E
就是这样一个案例。如果您尝试以 Perl 方式执行此操作
/\\Q$substring\\E/\n
Run Code Online (Sandbox Code Playgroud)\n您会$substring
以以下错误消息的形式得到与我上面给出的相同答案(使用或引用):
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当然,真正的第一步应该是在Raku 文档中搜索任何有用的内容。我敢打赌你做了这个 \xe2\x80\x93 文档目前不返回任何相关结果\\Q..\\E
。事实上,\\Q...\\E
这些结果中唯一真正的正匹配来自Perl 到 Raku 指南 - 简而言之:“使用String::ShellQuote
(因为\\Q\xe2\x80\xa6\\E
不完全正确)......”。这显然不是你感兴趣的。
文档网站并不总能为简单的问题提供良好的答案。有时,正如我们在\\Q...\\E
案例中清楚地看到的那样,它根本不会为相关搜索词提供任何答案。
同样,您可能这样做了,但最好记住:您可以通过添加到[raku]
查询中来限制标记为与 Raku 相关的 SO 搜索问题/答案。在这里,查询[raku] "\\Q...\\E"
不会产生任何相关的 \xe2\x80\x93 但是,由于你的问题,它将来会产生:)
Raku 的设计是在一系列“规范”文档中编写的,这些文档主要由 Larry Wall 在 20 年间编写。
\n(“规格”一词是“规格推测”的缩写。它既是Raku 语言的超权威详细且精确的规格(主要由拉里·沃尔本人撰写),又仅仅是推测——因为它全部受到实现。这两个方面是纠缠在一起的,现在已经过时了。所以不要 100% 依赖它们——但也不要忽略它们。)
\n“规格”,又名设计文档,是一个很棒的资源。您可以在design.raku.org的搜索框中输入搜索词,使用 google 进行搜索。
\n搜索列出了\\Q...\\E
7 页。唯一有用的匹配是概要 5:正则表达式和规则(“24 Jun 2002 \xe2\x80\x94 \\Q$var\\E /
...”)。如果我单击它,然后进行页内搜索\\Q
,我会得到 2 个匹配项,它们一起回答您的问题(至少对于变量 \xe2\x80\x93 ,它们没有提到文字字符串):
\n\n在 Raku 中
\n/ $var /
就像一个 Perl/ \\Q$var\\E /
\n\n\n
\\Q...\\E
序列消失了。
在这种情况下,搜索设计文档可以回答您的问题。但如果它没有/我们不理解答案怎么办?
\n在这种情况下,搜索 IRC 日志可能是一个不错的选择(如之前在过去问题的答案的“更快的答案”部分中讨论的那样)。IRC 日志是一个极其丰富的信息矿藏,具有出色的搜索功能。请阅读该部分以了解更多信息明确的一般指导。
\n在这种特殊情况下,如果我们在旧的 Raku 频道中进行搜索\\Q
,我们会得到一堆有用的匹配项。前几个都没有完全回答你的问题,但如果在上下文 \xe2\x80\x93 中阅读,有几个会(或至少使答案清晰),但正是需要阅读周围的上下文,这使我开始搜索IRC 日志位于前面的步骤下方。