当前位置: 首页 > 知识库问答 >
问题:

Perl只替换树中的顶级数字

益明朗
2023-03-14

我是这个网站的新手。这是一个困扰我多年的问题

((A:14,B:43):22,C:76,(D:54,(E:87,F:28):17):35);

树可以有多个级别,用括号表示。现在我想在顶层数字(分支长度)上加一个数字,比如10。这里只有三个顶级数字:22、76、35。转换后,字符串应如下所示:

((A:14,B:43):32,C:86,(D:54,(E:87,F:28):17):45);

我尽了最大努力想出了一个合适的正则表达式,但最终承认了自己的局限性。怎么才能做到呢?

共有3个答案

陈哲
2023-03-14

这需要一个递归正则表达式来匹配嵌套的括号。

首先定义一个“key”,它可以是一串大写字母,也可以是括号中任意数量的key:value对。

然后找到所有键,后跟一个冒号和一个十进制数,并对该数字进行算术运算。

use strict;
use warnings;

my $str = '((A:14,B:43):22,C:76,(D:54,(E:87,F:28):17):35)';

my $key = qr/ (?<key> [A-Z]+ | \( (?&key) : \d+ (?: , (?&key) : \d+ )* \)  ) /x;

$str =~ s/$key : \K ( \d+ ) /$2 + 10/xge;

print $str;

输出

((A:14,B:43):32,C:86,(D:54,(E:87,F:28):17):45)
沃弘图
2023-03-14

虽然我会选择解析整棵树,但当只使用正则表达式时,这个问题可以得到解决:

use strict; use warnings; use feature qw(say);
my $string = "((A:14,B:43):22,C:76,(D:54,(E:87,F:28):17):35)";
$string =~ s/^\(//;
$string =~ s/\)$//;
$string =~ s{
    \G ((?&PRELEM)) : (\d+) (,|$)
    (?(DEFINE)
        (?<SUBLIST> [(] (?&ELEM)(?:,(?&ELEM))* [)] )
        (?<ELEM> (?&PRELEM) : \d+ )
        (?<PRELEM> (?:[A-Z]|(?&SUBLIST)) )
    )
 }{"$1:".($2+10).$3}gex;
 say "($string)";

打印((A:14,B:43):32,C:86,(D:54,(E:87,F:28):17):45)

我为自上而下的递归解析定义了一个小语法,请根据需要进行调整。在顶层,我们有一些无趣的Pre元素,我们将它们存储在$1中,它们可以是单个字母,也可以是用括号括起来的树。一个后面是我们想要增加的数字,存储在$2中。它后面是字符串的结尾或逗号。我们以迭代方式进行匹配,从最后一个匹配开始(由/g选项和\g断言表示)。当我们构建替换字符串(我们使用/e选项)时,就会发生添加。

施利
2023-03-14
s/(?:^\(|(\((?:(?>[^()]*)|(?1))*\)))\K|:\K([0-9]+)/$2?$2+10:""/ge

匹配要跳过的内容或前面有:的数字。

你想跳过的是前面的)或任何平衡的括号集(平衡的括号regex几乎是从perlre字面上取下来的)。

在替换中,如果要修改的数字匹配,则添加10,否则不匹配。

但是你最好不要聪明,而是去解析、修改和重新定义你的树。

 类似资料:
  • 本文向大家介绍在Perl中替换数组元素,包括了在Perl中替换数组元素的使用技巧和注意事项,需要的朋友参考一下 现在我们将引入另一个名为splice()的函数,该函数具有以下语法: 语法 此函数将删除由OFFSET和LENGTH指定的@ARRAY元素,如果指定,则将其替换为LIST。最后,它返回从数组中删除的元素。以下是示例- 示例 输出结果 这将产生以下结果- 在这里,实际替换从第6个数字开始,

  • 我的问题类似于这个如何使用节点js获取谷歌云存储文件夹中的文件列表。 我只是想得到顶级的物体。我试着在这里跟随nodejs storage samples files.js,当我尝试“prefix”和“deliminator”的不同组合时,我很难获得顶级对象。我已尝试使用前缀“”和去污剂“/”。我尝试了前缀“/”和去污剂“/”。我尝试了一个前缀“/”没有除沫器。似乎并没有什么能让我只得到顶级对象的

  • 问题内容: 我正在尝试使用命令行perl替换多行文件中的文本。我正在使用Ubuntu Natty。 以下是我的文本文件(称为test.txt)的内容: 以下是我的perl命令: 但是,下面是我最终得到的结果,而不是替换文件中的所有文本: 我在RegexBuddy中为Perl尝试了Regex,它与文本文件中的所有内容都匹配,但是由于某些原因,在命令行上使用perl不能正常工作。 我将不胜感激。 提前

  • 我正在尝试对二叉树进行级别顺序遍历。但诀窍是代替正常的级别顺序遍历,我想做另一种选择。对于例如。 普通等级顺序遍历 : 我要找的是我们打印根。现在,对于每一个偶数级,我都想逆时针旋转,对于每奇数级,都会顺时针旋转: 对于这种遍历,输出应该是: 这是我到目前为止尝试的,但这产生的输出与我试图实现的输出略有不同: 该程序产生以下输出: < code>1 3 2 5 4 7 6 10 11 9 8 我需

  • 示例:/Hello/baby/Deneme//Hello2/ 输出:(/hello/)baby(/deneme/)(/hello2/)

  • 在这里学习我在Raku(neéPerl 6)的方法,非常好。但是我非常想念这个神奇的