请问匹配一个字符在一定区间中怎么写啊?

请问匹配一个字符在一定区间中怎么写啊?

这个属于学习问题
加入我想匹配a这个字符 规则是这样的 如果这个a出现字符中5到10次 就匹配出来 小于5次不行 大于10次也不行 该怎么写啊 好像a{5,10} 搞不定啊 他11次也能匹配出字符来 ..
我只想到了这么个笨办法,希望再有人能推敲推敲:

my $str = "testaaaaaaaaaaabbbb";
print $str;
if ( $str =~ /a{5,10}/ && !($str =~ /a{11}/)) {
        print "\nOK!";
}
else {
        print "\nNot mapped!";
}
The pattern /a{5,15}/ will match from five to fifteen repetitions of the letter a. If the a appears three times, that's too few, so it won't match. If it appears five times, it's a match. If it appears ten times, that's still a match. If it appears twenty times, the first fifteen will match since that's the upper limit.
/[^a]a{5,10}[^a]/ ....
/[^a]a{5,10}[^a]/ ....
应该不行吧。。
遇到这样 aaaaa前后都空的情况就不行了

这个问题有点意思,mark一个.
你要的其实就是断言:
断言 a{5,10} 的前面不能和 a 相连,后面也不能和 a 相连。
分别用向前向后断言就可以了。

[Copy to clipboard] [ - ]
CODE:
flw@debian:~/study$ cat ttt.pl
#!/usr/bin/perl

foreach ( map { 'a' x $_ . "\n" } (0..15) ){
    if ( /(?<!a)a{5,10}(?!a)/ ){
        print "+ ";
    }
    else{
        print "- ";
    }

    print;
}
flw@debian:~/study$ ./ttt.pl
-
- a
- aa
- aaa
- aaaa
+ aaaaa
+ aaaaaa
+ aaaaaaa
+ aaaaaaaa
+ aaaaaaaaa
+ aaaaaaaaaa
- aaaaaaaaaaa
- aaaaaaaaaaaa
- aaaaaaaaaaaaa
- aaaaaaaaaaaaaa
- aaaaaaaaaaaaaaa
flw@debian:~/study$

恩,相当于提前看了匹配字符串前后的字母,学习。。。
记得正则表达式这书中有讲,有四个形式,前肯定断言,前否定断言,后肯定断言,后否定断言,这里用的是前后否定断言


QUOTE:
原帖由 flw 于 2008-7-23 18:10 发表
你要的其实就是断言:
断言 a{5,10} 的前面不能和 a 相连,后面也不能和 a 相连。
分别用向前向后断言就可以了。

flw@debian:~/study$ cat ttt.pl
#!/usr/bin/perl

foreach ( map { 'a' x $_ . "\n" } ...

这个好像实现不了吧
假如这样的字符串:
$s="t111sgdt11111sjddjt1111111111"
我想匹配出 t111 和t111111 而不想匹配出t1111111111
好像实现不了吧
Nothing is impossible ^_^

QUOTE:
D:\lxmxn\work\Other>type ss.pl
$s="t111sgdt11111sjddjt1111111111";

while ( $s =~ m/(?>t1{3,6})(?!1)/g ) {
    print "[$&] ($` -- $')\n";
}

D:\lxmxn\work\Other>ss.pl
[t111] ( -- sgdt11111sjddjt1111111111)
[t11111] (t111sgd -- sjddjt1111111111)

D:\lxmxn\work\Other>