gpt4 book ai didi

regex - 使用正则表达式在 perl 中打印出现的字母

转载 作者:行者123 更新时间:2023-12-02 06:55:58 24 4
gpt4 key购买 nike

实现一种使用重复字符的计数来执行字符串压缩的方法。例如 aabcccccaaaaaaa 将变为 a2b1c5a7。将字符串解压为原始字符串。

我尝试了下面的代码,但正在寻找一些单一的正则表达式解决方案 -

sub print_word{
my $s=shift;
my @a=split(//, $s);
my $c=1;
my $r='';

my $t=$a[0];
for( my $i=1; $i<=$#a; $i++) {
if($t eq $a[$i]) {
$c++;
}else{
$r.=$t."$c";
$t=$a[$i];
$c=1;
}
}
$r.=$t."$c";
return $r;
}
print print_word('aabcccccaaaaaaa') . "\n";

请在一行中使用正则表达式提供一些内容。

最佳答案

好的,所以这里的技巧是 - 将反向引用与您的字符串匹配;

my $string = 'aabcccccaaaaaaa';

$string =~ s/((\w)\2*)/ "$2". length ($1) /eg;
print $string;

这给出:

a2b1c5a7

我们“捕获”一个单词字符 (\w),我们使用 \2* 来指代零个或多个(因此使其成为“更多”因为第一个字母)。

然后我们将 that 封装在另一个捕获组中,这意味着我们有 \2$2 作为我们的单个字母,并且 \1$1 作为同一字母的子串。

我们打印 $2 然后 - 因为我们在正则表达式上设置了 e 标志 - 它计算 length ( $1 ) 并插入它.

为了扩展我所说的效率 - 我们需要使用代码分析器。

使用类似 Devel::NYTProf 的东西:

perl -d:NYTProf script.pl
nytprofhtml --open

您编写的代码:

Your loop

我的例子

My Example

现在,这里有规模问题 - 我的意思是,如果您反复运行,您可能会发现正则表达式解决方案开始“获胜”。使用正则表达式会产生开销,某些正则表达式可能会非常“昂贵”。参见示例:http://blog.codinghorror.com/regex-performance/

尝试相同的测试 - 例如 - 在一个循环中运行两个 100,000 次,数字开始趋于平衡。

我的:

Regex x 100,000

你的:

Yours x 100,000

但我仍然建议 - 在确定需要之前不要担心性能。在那之前,选择最容易阅读和理解的内容。

直到我运行关于 catastrophic backtracking 的结果时我才确定在回答另一个问题时,这就是为什么“小心使用正则表达式”在我的脑海中很重要。

他们看起来很整洁,也很聪明,但有时他们聪明了。但在这种情况下,这似乎并不适用。正则表达式引擎有一个开销,但是一旦它开始“工作”并且运行得很好。

了解正则表达式“有多聪明”的有用技巧之一是使用 re 'debug';

在我的示例中,这会打印:

Compiling REx "((\w)\2*)"
Final program:
1: OPEN1 (3)
3: OPEN2 (5)
5: POSIXD[\w] (6)
6: CLOSE2 (8)
8: CURLYX[2] {0,32767} (13)
10: REF2 (12)
12: WHILEM[1/1] (0)
13: NOTHING (14)
14: CLOSE1 (16)
16: END (0)
stclass POSIXD[\w] minlen 1
Matching REx "((\w)\2*)" against "aabcccccaaaaaaa"
Matching stclass POSIXD[\w] against "aabcccccaaaaaaa" (15 bytes)
0 <> <aabcccccaa> | 1:OPEN1(3)
0 <> <aabcccccaa> | 3:OPEN2(5)
0 <> <aabcccccaa> | 5:POSIXD[\w](6)
1 <a> <abcccccaaa> | 6:CLOSE2(8)
1 <a> <abcccccaaa> | 8:CURLYX[2] {0,32767}(13)
1 <a> <abcccccaaa> | 12: WHILEM[1/1](0)
whilem: matched 0 out of 0..32767
1 <a> <abcccccaaa> | 10: REF2: "a"(12)
2 <aa> <bcccccaaaa> | 12: WHILEM[1/1](0)
whilem: matched 1 out of 0..32767
2 <aa> <bcccccaaaa> | 10: REF2: "a"(12)
failed...
whilem: failed, trying continuation...
2 <aa> <bcccccaaaa> | 13: NOTHING(14)
2 <aa> <bcccccaaaa> | 14: CLOSE1(16)
2 <aa> <bcccccaaaa> | 16: END(0)
Match successful!
Matching REx "((\w)\2*)" against "bcccccaaaaaaa"
Matching stclass POSIXD[\w] against "bcccccaaaaaaa" (13 bytes)
2 <aa> <bcccccaaaa> | 1:OPEN1(3)
2 <aa> <bcccccaaaa> | 3:OPEN2(5)
2 <aa> <bcccccaaaa> | 5:POSIXD[\w](6)
3 <aab> <cccccaaaaa> | 6:CLOSE2(8)
3 <aab> <cccccaaaaa> | 8:CURLYX[2] {0,32767}(13)
3 <aab> <cccccaaaaa> | 12: WHILEM[1/1](0)
whilem: matched 0 out of 0..32767
3 <aab> <cccccaaaaa> | 10: REF2: "b"(12)
failed...
whilem: failed, trying continuation...
3 <aab> <cccccaaaaa> | 13: NOTHING(14)
3 <aab> <cccccaaaaa> | 14: CLOSE1(16)
3 <aab> <cccccaaaaa> | 16: END(0)
Match successful!
Matching REx "((\w)\2*)" against "cccccaaaaaaa"
Matching stclass POSIXD[\w] against "cccccaaaaaaa" (12 bytes)
3 <aab> <cccccaaaaa> | 1:OPEN1(3)
3 <aab> <cccccaaaaa> | 3:OPEN2(5)
3 <aab> <cccccaaaaa> | 5:POSIXD[\w](6)
4 <aabc> <ccccaaaaaa> | 6:CLOSE2(8)
4 <aabc> <ccccaaaaaa> | 8:CURLYX[2] {0,32767}(13)
4 <aabc> <ccccaaaaaa> | 12: WHILEM[1/1](0)
whilem: matched 0 out of 0..32767
4 <aabc> <ccccaaaaaa> | 10: REF2: "c"(12)
5 <aabcc> <cccaaaaaaa> | 12: WHILEM[1/1](0)
whilem: matched 1 out of 0..32767
5 <aabcc> <cccaaaaaaa> | 10: REF2: "c"(12)
6 <abccc> <ccaaaaaaa> | 12: WHILEM[1/1](0)
whilem: matched 2 out of 0..32767
6 <abccc> <ccaaaaaaa> | 10: REF2: "c"(12)
7 <bcccc> <caaaaaaa> | 12: WHILEM[1/1](0)
whilem: matched 3 out of 0..32767
7 <bcccc> <caaaaaaa> | 10: REF2: "c"(12)
8 <ccccc> <aaaaaaa> | 12: WHILEM[1/1](0)
whilem: matched 4 out of 0..32767
8 <ccccc> <aaaaaaa> | 10: REF2: "c"(12)
failed...
whilem: failed, trying continuation...
8 <ccccc> <aaaaaaa> | 13: NOTHING(14)
8 <ccccc> <aaaaaaa> | 14: CLOSE1(16)
8 <ccccc> <aaaaaaa> | 16: END(0)
Match successful!
Matching REx "((\w)\2*)" against "aaaaaaa"
Matching stclass POSIXD[\w] against "aaaaaaa" (7 bytes)
8 <ccccc> <aaaaaaa> | 1:OPEN1(3)
8 <ccccc> <aaaaaaa> | 3:OPEN2(5)
8 <ccccc> <aaaaaaa> | 5:POSIXD[\w](6)
9 <ccccca> <aaaaaa> | 6:CLOSE2(8)
9 <ccccca> <aaaaaa> | 8:CURLYX[2] {0,32767}(13)
9 <ccccca> <aaaaaa> | 12: WHILEM[1/1](0)
whilem: matched 0 out of 0..32767
9 <ccccca> <aaaaaa> | 10: REF2: "a"(12)
10 <cccccaa> <aaaaa> | 12: WHILEM[1/1](0)
whilem: matched 1 out of 0..32767
10 <cccccaa> <aaaaa> | 10: REF2: "a"(12)
11 <cccccaaa> <aaaa> | 12: WHILEM[1/1](0)
whilem: matched 2 out of 0..32767
11 <cccccaaa> <aaaa> | 10: REF2: "a"(12)
12 <cccccaaaa> <aaa> | 12: WHILEM[1/1](0)
whilem: matched 3 out of 0..32767
12 <cccccaaaa> <aaa> | 10: REF2: "a"(12)
13 <cccccaaaaa> <aa> | 12: WHILEM[1/1](0)
whilem: matched 4 out of 0..32767
13 <cccccaaaaa> <aa> | 10: REF2: "a"(12)
14 <cccccaaaaaa> <a> | 12: WHILEM[1/1](0)
whilem: matched 5 out of 0..32767
14 <cccccaaaaaa> <a> | 10: REF2: "a"(12)
15 <cccccaaaaaaa> <> | 12: WHILEM[1/1](0)
whilem: matched 6 out of 0..32767
15 <cccccaaaaaaa> <> | 10: REF2: "a"(12)
failed...
whilem: failed, trying continuation...
15 <cccccaaaaaaa> <> | 13: NOTHING(14)
15 <cccccaaaaaaa> <> | 14: CLOSE1(16)
15 <cccccaaaaaaa> <> | 16: END(0)
Match successful!
Matching REx "((\w)\2*)" against ""
Regex match can't succeed, so not even tried
Freeing REx: "((\w)\2*)"

如您所见,它实际上在这个示例中做了很多工作。但由于它不必在任何时候回溯以匹配您的字符串,因此它也不会真的浪费任何努力。

关于regex - 使用正则表达式在 perl 中打印出现的字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31318958/

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