gpt4 book ai didi

regex - 为什么是s/^\s+|\s+$//g;比两个单独的替换慢得多?

转载 作者:行者123 更新时间:2023-12-03 23:22:30 26 4
gpt4 key购买 nike

Perl 常见问题解答条目 How do I strip blank space from the beginning/end of a string?指出使用

s/^\s+|\s+$//g;

比分两步做要慢:
s/^\s+//;
s/\s+$//;

为什么这个组合语句明显比单独的语句慢(对于任何输入字符串)?

最佳答案

当使用“固定”或“锚定”子字符串而不是“ float ”子字符串时,Perl 正则表达式运行时运行得更快。当您可以将子字符串锁定到源字符串中的某个位置时,它是固定的。 '^' 和 '$' 都提供锚定。但是,当您使用替代“|”时,编译器不会将选项识别为固定的,因此它使用不太优化的代码来扫描整个字符串。在过程结束时,两次查找固定字符串比查找一次 float 字符串要快得多。在相关的说明中,阅读 perl 的 regcomp.c 会让你失明。

更新 :
这里有一些额外的细节。如果您已使用调试支持编译它,则可以使用“-Dr”标志运行 perl,它会转储正则表达式编译数据。这是你得到的:

~# debugperl -Dr -e 's/^\s+//g'
Compiling REx `^\s+'
size 4 Got 36 bytes for offset annotations.
first at 2
synthetic stclass "ANYOF[\11\12\14\15 {unicode_all}]".
1: BOL(2)
2: PLUS(4)
3: SPACE(0)
4: END(0)
stclass "ANYOF[\11\12\14\15 {unicode_all}]" anchored(BOL) minlen 1
# debugperl -Dr -e 's/^\s+|\s+$//g'
Compiling REx `^\s+|\s+$'
size 9 Got 76 bytes for offset annotations.

1: BRANCH(5)
2: BOL(3)
3: PLUS(9)
4: SPACE(0)
5: BRANCH(9)
6: PLUS(8)
7: SPACE(0)
8: EOL(9)
9: END(0)
minlen 1

请注意第一个转储中的“锚定”一词。

关于regex - 为什么是s/^\s+|\s+$//g;比两个单独的替换慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2313879/

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