我是这个网站的新手。这是一个困扰我多年的问题
((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);
我尽了最大努力想出了一个合适的正则表达式,但最终承认了自己的局限性。怎么才能做到呢?
这需要一个递归正则表达式来匹配嵌套的括号。
首先定义一个“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)
虽然我会选择解析整棵树,但当只使用正则表达式时,这个问题可以得到解决:
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
选项)时,就会发生添加。
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不能正常工作。 我将不胜感激。 提前
示例:/Hello/baby/Deneme//Hello2/ 输出:(/hello/)baby(/deneme/)(/hello2/)
我正在尝试对二叉树进行级别顺序遍历。但诀窍是代替正常的级别顺序遍历,我想做另一种选择。对于例如。 普通等级顺序遍历 : 我要找的是我们打印根。现在,对于每一个偶数级,我都想逆时针旋转,对于每奇数级,都会顺时针旋转: 对于这种遍历,输出应该是: 这是我到目前为止尝试的,但这产生的输出与我试图实现的输出略有不同: 该程序产生以下输出: < code>1 3 2 5 4 7 6 10 11 9 8 我需
在这里学习我在Raku(neéPerl 6)的方法,非常好。但是我非常想念这个神奇的