- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
实现一种使用重复字符的计数来执行字符串压缩的方法。例如 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
您编写的代码:
我的例子
现在,这里有规模问题 - 我的意思是,如果您反复运行,您可能会发现正则表达式解决方案开始“获胜”。使用正则表达式会产生开销,某些正则表达式可能会非常“昂贵”。参见示例:http://blog.codinghorror.com/regex-performance/
尝试相同的测试 - 例如 - 在一个循环中运行两个 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/
有没有更好的方法用 PHP 将数据输出到 html 页面? 如果我想在 php 中用一些 var 制作一个 div,我会写类似的东西 print (''.$var.''); 或 echo "''.$v
我可以使用 java awt print 来打印文档/文件而不是使用 javax print 吗?我发现在 java awt print 中有一个选项可以使用 AttributedString 将内容
目前我通过以下方式运行 R 脚本: R --slave argument1 argument2 ... 我想知道 R 中关于如何退出脚本并发出警告的最佳实践,q() 会这样做吗? if(!file.
谁能告诉我如何编写一个程序,用 gcc 编译时打印 c ,用 g++ 编译时打印 c++? 最佳答案 #ifdef __cplusplus printf("c++\n"); #else
我需要支持在 KitKat 设备上打印,但我的目标 SDK 是 13(无法更改)。 特别是我需要打印一个 webview。 这是用于打印 webview 的 API: http://developer
我正在尝试创建一个简单的函数,其中 python 将根据您的年份输入计算年龄。我已经尝试了几种方法,但我没有运气 atm。 附:对不起,我是新手。 ame = input(" Enter your n
JavaFX 2.0 是否支持打印?我有一个文本区域,我从中获取文本然后我想打印它,但似乎没有这个功能。 当然,这里我说的是打印到打印机。 :) 最佳答案 尚不支持。作为一种解决方法,您可以使用 Ja
我试图找出printOn的重点。我查看了一些实现它的类,看起来它只是帮助打印不同数据类型的单位。这是准确的吗? 如果是这样,有人能指出我如何为我自己的类(class)实现这一点的正确方向吗?我将在可能
我无法让 IE 打印我的 Canvas (使用 excanvas 生成)...我使用的是最新版本的 excanvas。 http://dl.dropbox.com/u/997831/canvas.ht
我搜索了很多但没有人回答我的问题,我读到在这样的信号处理程序中使用 cout 是不安全的: void ctrlZHandler(int sig_num) { //SIGTSTP-18
我有兴趣打印一系列查询。我有以下代码。 start = datetime.datetime(2012, 2, 2, 6, 35, 6, 764) end = datetime.datetime(201
public class javaClass { public static void main(String [] arg) { String row1 = "A____A"
我需要写入前一行的命令,例如不带\n 的 print()。 下面是一些示例代码: a=0 print("Random string value") if a==0: print_to_prev
我有一个使用 UIKit 和 Objective C 的旧 iOS 应用程序,我目前正在将其移植到 SwiftUI 和 Swift。一切都很顺利,我喜欢 Swift 和 SwiftUI。该应用程序已经
我创建了一个求和函数,它接受一个开始编号和一个结束编号,并返回这两点之间的总和答案 def print_sum_equations(start_number,end_number):
在 Perl 6 中,print 和有什么区别? , put和 say ? 我怎么看 print 5不同,但 put 5和 say 5看起来一样。 最佳答案 put $a就像 print $a.Str
我正在使用 here 中的 getOrgChart 库,我正在尝试打印整个图表,而不仅仅是可见部分。不幸的是,当使用标准库打印功能时,它只会打印出第一部分,而我不知道如何打印整个图表(该图表相当宽,大
我制作了一个非常适合 A4 页面的 View 。现在我想打印它。请注意,我没有使用drawRect或类似的东西,只是一个带有 subview 和文本标签的普通 View 。我的问题是,我对该 View
由于 Cocoa-Java 已弃用,我正在将 Cocoa-Java 代码迁移到 Cocoa + JNI。该代码打印存储在文件中的图像。新的 Cocoa 代码基本上是: NSImage *image =
这个问题已经有答案了: Printing a TDBGrid (4 个回答) 已关闭 6 年前。 如何在不安装或下载组件的情况下打印 DBGrid? 或者 如何将 DBGrid 的数据放入 RichE
我是一名优秀的程序员,十分优秀!