哪种 Raku 正则表达式修饰符可以使点与换行符匹配(如 Perl 的 /s)?

use*_*456 11 regex newline raku

如何使点 ( .) 元字符匹配 Raku 正则表达式中的换行符?在 Perl 中,我会使用点匹配换行符( /s)?

rai*_*iph 9

TL;DR Raku 中“Perl 点匹配换行符”的等价物是., 而\\Q...\\E它的 是...

\n

对于大多数此类问题,有一些方法可以更轻松(通常只需输入感兴趣的搜索词)和快速(通常是几秒、几分钟)获得更好的答案(比 SO 更权威、更全面等)。我在这个答案中解决了这个问题。

\n

Raku 相当于“Perl 点匹配换行符”吗?

\n

只是.

\n

如果您运行以下 Raku 程序:

\n
/./s\n
Run Code Online (Sandbox Code Playgroud)\n

您将看到以下错误消息:

\n
Unsupported use of /s.  In Raku please use: .  or \\N.\n
Run Code Online (Sandbox Code Playgroud)\n

如果您.在文档站点的搜索框中键入内容,它会列出多个条目。其中之一是. (regex)。单击它会提供示例并显示:

\n
\n

.正则表达式中的未转义点与任何单个字符匹配。...
\n值得注意的.是还匹配逻辑换行符\\n

\n
\n

我的猜测是,您要么在在这里提问之前没有寻找答案(这很公平——我并不是说不这样做;也就是说,如果您查看,您通常可以立即轻松获得好的答案正确的地方,我将在这个答案中介绍)或者对您得到的答案不满意(在这种情况下,请再次阅读)。

\n

如果我只是重复您已经阅读过的内容,或者信息不够,在我写下初步尝试\\Q...\\E您的问题提供类似答案之后,我将在下面提供更好的答案 -当我尝试文档步骤时失败

\n

Raku 相当于 Perl 的什么\\Q...\\E

\n

\'...\',或者$foo如果...是变量名的元语法。

\n

如果您运行以下 Raku 程序:

\n
/\\Qfoo\\E/\n
Run Code Online (Sandbox Code Playgroud)\n

您将看到以下错误消息:

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

如果您\\Q...\\E在文档站点的搜索框中键入内容,它只会列出一个条目:Not in Index (try site search)。如果您继续尝试按照建议进行搜索,您将根据谷歌获得匹配的页面。对我来说,列出的第三页/匹配(Perl 到 Raku 指南 - 简而言之:“使用String::ShellQuote(因为\\Q\xe2\x80\xa6\\E不完全正确)...”)是 27 个匹配中唯一真正的正匹配\\Q...\\E而且这显然不是感兴趣的

\n

因此,搜索文档\\S...\\E似乎完全失败了。

\n
\n

如何获得诸如“Perl 的 Raku 等价物是什么\\Q...\\E?”之类的问题的答案?如果文档网站没有帮助(并且人们没有意识到 Rakudo 恰好有一个内置的错误消息专门用于感兴趣的确切内容和/或不确定错误消息的含义)?如果 Rakudo 和文档网站都没有说明问题怎么办?

\n

SO 是一种选择,但是当对 Raku 感兴趣的人们因为很难找到答案或根本不存在而无法从文档网站获得问题时,他们可以经常轻松快速地获得问题的良好答案在文档中?

\n

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

\n

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

\n

幸运的是,还有其他几个易于搜索的丰富且高度相关的信息来源,当文档网站不适用于某些类型的信息/搜索时,这些来源通常可以发挥作用。如果您心里有精确的搜索词,例如/s\\Q...\\E和/或愿意浏览信息,只要它的高信号/低噪音,这种情况尤其可能发生。我将在本答案的其余部分介绍其中两个资源。

\n

存档的“规范”文档

\n

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

\n

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

\n

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

\n
\n

搜索/s列出了 25 页。唯一有用的匹配是概要 5:正则表达式和规则(“24 Jun 2002 \xe2\x80\x94 没有/s/m修饰符(对元字符的更改替换它们 - 见下文)。”单击它。然后执行 in-页面搜索/s (注意空格)。您将看到 3 个匹配项:

\n
\n

没有/sor/m修饰符(对元字符的更改会替换它们 - 见下文)

\n
\n
\n

.现在匹配任何字符,包括换行符。(/s修改器消失了。)

\n
\n
\n

.匹配任何内容,而\\N匹配除匹配之外的任何内容\\n。(/s修饰符消失了。)特别是,\\N既不匹配回车符也不匹配换行符。

\n
\n
\n

搜索列出了\\Q...\\E7 页。唯一有用的匹配还是概要 5:正则表达式和规则(“24 Jun 2002 \xe2\x80\x94 \\Q$var\\E /...”)。点击它。然后在页内搜索\\Q. 您将看到 2 场比赛:

\n
\n

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

\n
\n
\n

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

\n
\n

聊天记录

\n

我已将我的答案中的“更快的答案”部分扩展为您之前的一个问题,以讨论搜索 Raku“聊天日志”。它们是一个极其丰富的信息宝库,具有出色的搜索功能。请阅读我之前回答的该部分以获得明确的一般指导。这个答案的其余部分将说明/s\\Q...\\E

\n
\n

/ newline . ** ^200 \'/s\' /在 2010 年至 2015 年的旧 Raku 频道中搜索正则表达式发现了此匹配

\n
\n

。匹配任何内容,而 \\N 匹配除 \\n 之外的任何内容。(/s 修饰符消失了。)特别是,\\N 既不匹配回车符也不匹配换行符。

\n
\n

请注意我的正则表达式的精明。该模式是单词“newline”(希望不太常见),后跟在 200 个字符内的两个字符序列/s(我怀疑这比 更常见newline)。我限制在 2010-2014 年,因为搜索旧 Raku 频道整个 15 年的正则表达式会给 Liz 的服务器带来负担并超时。/s在试图找到一些合适的匹配(不是讽刺结束!)的几分钟内,我得到了上面引用的那句话。

\n
\n

\\Q在旧 Raku 频道中的搜索立即获得了成功。在想到“我可以搜索日志”后的 30 秒内,我得到了一堆有用的匹配结果。

\n

  • 我个人很喜欢这个奇怪的“How-do-I-do-this-Perl5-idiom-in-Raku”这样的问题,因为我经常意识到 Raku 语法变得多么简单(也更直接)。 (2认同)