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

标签 regex markdown raku github-flavored-markdown

更新:下面添加的更正代码
我有一个名为 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/

    相关文章:

    github - GitHub 使用什么库来呈现 Markdown 文档之间的差异?

    haskell - 是否有任何有文化的编程环境支持即时结果?

    pdf - 将多个带有链接的 Markdown 文件转换为 PDF

    raku - 递归生成器 - 手动 zip 与运算符

    regex - 如何在 bash 脚本中存储 "time"函数输出的子字符串

    mysql - 如何使用正则表达式更改多个表

    regex - NGINX - 正则表达式 - 搜索非字母数字的整个位置

    java - 如何删除特殊字符而不删除另一种语言的文本?

    perl - 如何使用 Perl 6 中的 Perl 5 模块?

    raku - 馈送运算符(operator)管道的行为