gpt4 book ai didi

regex - Raku Regex 捕获和修改 LFM 代码块

转载 作者:行者123 更新时间:2023-12-03 16:00:04 25 4
gpt4 key购买 nike

更新:下面添加的更正代码
我有一个名为 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)?
  • 刚刚估计的LFM格式

  • 更正的代码:
    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

  • TL? 然后阅读@jjemerelo 的出色答案,它不仅提供了单线解决方案,而且还以紧凑的形式提供了更多 ;
  • 博士? 哦,imo你在这个答案中遗漏了一些JJ(合理地!)忽略的好东西。不过,JJ 是炸弹。先去读吧。 :)

  • 使用 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com