如何统计某字符串中,3个正则各出现几次?

如何统计某字符串中,3个正则各出现几次?

比如
a$='12345abcdefghijk';

\d\d\d 出现了3次,
abc 出现了1次
xyz 出现了0次

能同时获取位置更好。

————————————————————

如果 \d\d\d 算出现1次,会简单些吗?
这个重叠倒不是重点。
_____________________________
实际问题是:
有一百左右的patten,像 [GT]AAT[AT][TGC]A 之类的, 需要在约5万条,长1k到10k的字符串中判断,
每条字符串中,前述的patten各出现了几次. 能标出位置更好.

感觉每个正则分别去判断会比较慢。

对于有几十上百个正则patten的情况,一般是如何减小运算量的?
$string='12345abcd456efghijk\d\d\d';

print "123: " , 0+$string=~s/123/123/g , "\n";
print "45: " , 0+$string=~s/45/45/g , "\n";
print '\d: ' , 0+$string=~s/\\d/\\d/g , "\n";
print "xyz: " , 0+$string=~s/xyz/xyz/g , "\n";



输出
123: 1
45: 2
\d: 3
xyz: 0

我用的是比较傻的办法 用xyz对去全文替换xyz
s/xyz/xyz/g 在标量上下文返回就会返回匹配次数

至于想要知道匹配位置,那我建议你还是用
index string, substring, start_position




QUOTE:
原帖由 StephenHuu 于 2008-11-27 01:27 发表
$string='12345abcd456efghijk\d\d\d';

print "123: " , 0+$string=~s/123/123/g , "\n";
print "45: " , 0+$string=~s/45/45/g , "\n";
print '\d: ' , 0+$string=~s/\\d/\\d/g , "\n";
print "xyz: " , ...

关于位置可以perldoc perlvar 看看 @+, @-, $+等变量。
一般来说,是每个patten都用一次s///好,还是用 | 把所有patten并列后再看找到的是哪个好?


QUOTE:
原帖由 galaxy001 于 2008-11-27 12:05 发表
一般来说,是每个patten都用一次s///好,还是用 | 把所有patten并列后再看找到的是哪个好?

我觉得这个一定要具体问题具体分析的。你还不如把你的问题完整地贴出来。
多个pattern有时候没法一起匹配
有一百左右的patten,像 [GT]AAT[AT][TGC]A 之类的, 需要在约5万条,长1k到10k的字符串中判断,
每条字符串中,前述的patten各出现了几次. 能标出位置更好.


QUOTE:
原帖由 ynchnluiti 于 2008-11-27 12:37 发表
多个pattern有时候没法一起匹配

(\d\sATA)|(\w\dGTA)|(^AT.*$)
这样的不行吗? (这会在寝室,没法测试)