$string=~/^ # from the start of the string
(?:.{$p0}) # skip (don't capture) "$p0" occurrences of any character
(?:...)*? # skip 3 characters at a time,
# as few times as possible (non-greedy)
(aaa|bbb|ccc) # capture aaa or bbb or ccc as $1
/x;
pos $string = $start_from;
$string =~ m/\G # anchor to previous pos()
((?:...)*?) # capture everything up to the match
(aaa|bbb|ccc)
/xs or die "No match"
my $result = length($1) / 3;
5条答案
按热度按时间niknxzdl1#
(假设p0从0开始)。
当然,在字符串上使用substr向前跳可能更有效:
smdnsysy2#
你不能真正用正则表达式来计数,但是你可以这样做:
但我认为使用substr()和unpack()拆分为三元组并在for循环中遍历三元组会更快一些。
(edit:它是长度(),而不是长度();-)
plicqrtu3#
这个过程的主要部分是split /(...)/,但是在这个过程的最后,你会得到你的位置和发生数据。
或者通过正则表达式进行简单计数(它使用Experimental(??{}))
lo8azlld4#
如果速度是一个严重的问题,你可以,取决于这3个字符串是什么,通过创建一个树(例如Aho-Corasick算法或类似)得到真正的花式。
每个可能状态的Map都是可能的,例如,如果没有字符串以'a'开始,则state[0]['a'] = 0。
gdx19jrr5#
莫里茨说这可能比正则表达式快,即使慢一点,在凌晨5点也更容易理解。