更新:下面添加的更正代码
我有一个名为 sample.md
的 Leanpub 风格的 markdown* 文件我想使用 Raku Regex
将其代码块转换为 Github 风格的 Markdown 样式
Here's a sample **ruby** code, which
prints the elements of an array:
{:lang="ruby"}
['Ian','Rich','Jon'].each {|x| puts x}
Here's a sample **shell** code, which
removes the ending commas and
finds all folders in the current path:
{:lang="shell"}
sed s/,$//g
find . -type d
为了捕获lang
值,例如ruby
来自 {:lang="ruby"}
并将其转换为```ruby
我使用此代码my @in="sample.md".IO.lines;
my @out;
for @in.kv -> $key,$val {
if $val.starts-with("\{:lang") {
if $val ~~ /^{:lang="([a-z]+)"}$/ { # capture lang
@out[$key]="```$0"; # convert it into ```ruby
$key++;
while @in[$key].starts-with(" ") {
@out[$key]=@in[$key].trim-leading;
$key++;
}
@out[$key]="```";
}
}
@out[$key]=$val;
}
包含正则表达式的行给出无法修改不可变对 (lang => True) 错误。
我刚开始使用正则表达式。而不是
([a-z]+)
我试过(\w)
它给了Unrecognized backslash sequence: '\w'
错误等等。如何正确捕获和修改
lang
使用正则表达式的值(value)?更正的代码:
my @in="sample.md".IO.lines;
my \len=@in.elems;
my @out;
my $k = 0;
while ($k < len) {
if @in[$k] ~~ / ^ '{:lang="' (\w+) '"}' $ / {
push @out, "```$0";
$k++;
while @in[$k].starts-with(" ") {
push @out, @in[$k].trim-leading;
$k++; }
push @out, "```";
}
push @out, @in[$k];
$k++;
}
for @out {print "$_\n"}
最佳答案
TL;DR
使用 Perl 正则表达式
正则表达式有很多方言。您使用的正则表达式模式是 Perl 正则表达式,但您没有告诉 Raku。因此,它将您的正则表达式解释为 Raku 正则表达式,而不是 Perl 正则表达式。这就像将 Python 代码提供给
perl
.所以错误信息是没有用的。一种选择是切换到 Perl 正则表达式处理。为此,此代码:
/^{:lang="([a-z]+)"}$/
需要m :P5
在开始时:m :P5 /^{:lang="([a-z]+)"}$/
m
使用 /.../
时是隐式的在假定您的意思是立即匹配的上下文中,但是因为 :P5
正在添加“副词”以修改 Raku 如何解释正则表达式中的模式,还必须添加 m
.:P5
仅支持一组有限的 Perl 正则表达式模式。也就是说,对于您在问题中编写的正则表达式应该足够了。使用 Raku 正则表达式
如果你想使用 Raku 正则表达式,你必须学习 Raku 正则表达式语言。
Raku 正则表达式语言的“精神”与 Perl 的相同,一些绝对的基本语法与 Perl 的相同,但它的不同之处足以让您将其视为另一种正则表达式方言,只是一种通常“有动力”的方言up”相对于 Perl 的正则表达式。
要以 Raku 格式重写正则表达式,我认为是:
/ ^ '{:lang="' (<[a..z]>+) '"}' $ /
(利用 Raku 正则表达式中的空白被忽略的事实。)代码中的其他问题
修复正则表达式后,您的代码中会遇到其他问题。
我遇到的第一个问题是
$key
是只读的,所以 $key++
失败。一种选择是使其可写,通过编写 -> $key is copy ...
,这使得 $key
.kv
传递的索引的读写副本.但是解决这个问题会导致另一个问题。而且代码太复杂了,我得出的结论是,我最好不要再追究下去了。我已经解决了您的直接障碍,希望对您有所帮助。
关于regex - Raku Regex 捕获和修改 LFM 代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66403652/