【正则问题】取一个特定字符为开头 非特定字符为结尾的单词方法

【正则问题】取一个特定字符为开头 非特定字符为结尾的单词方法

字符例子如下:
$str = "saaaaa sdjfzv  saata sa%##%%¥aat swjfsd skdfje";
就是取出以s字母为开头 但不以a 字母为结尾的单词 sa%##%%¥aat  这个也算哦
我主要是搞不清楚非a字母为结尾的方法 知道的指点一下
谢谢

#!/usr/bin/perl

use strict;
use warnings;

$_ = "saaaaa sdjfzv  saata saaaaaaat swjfsd skdfje";

my @t = /(\bs[^a]+\b)/g;

print "$_ " for @t;


QUOTE:
原帖由 cobrawgl 于 2008-7-24 12:35 发表
#!/usr/bin/perl

use strict;
use warnings;

$_ = "saaaaa sdjfzv  saata saaaaaaat swjfsd skdfje";

my @t = /(\bs[^a]+\b)/g;

print "$_ " for @t;

这个方法我知道
只是没有达到要求啊 [^a] 是说s后面不能跟字母a
假如有像 saaaat这样的单词就去不出来
我的意思就单词的结尾不能使a 但中间是可以包含的
#!perl

$_ = "saaaaa sdjfzv  saata saaaaaaat swjfsd skdfje";

my @t = /(\bs\w+[b-z]\b)/g;

print "$_ " for @t;
我不知道为什么

#!perl

$_ = "saaaaa sdjfzv  saata saaaaaaat swjfsd skdfje";

my @t = /(\bs\w+[^a]\b)/g;

print "$_ " for @t;

不行

请指教
可能空白页在[^a]之中~
但是如果不能以b结尾呢,怎么进行字符集的减运算,请指教


QUOTE:
原帖由 hdc1112 于 2008-7-24 14:01 发表
#!perl

$_ = "saaaaa sdjfzv  saata saaaaaaat swjfsd skdfje";

my @t = /(\bs\w+\b)/g;

print "$_ " for @t;

那我为什么用 /(\bs(.*)+[b-z]\b)/g; 就不行呢   只是将 \w字符集换为任意的(.*)就不行了呢
如果一段字符串中 包含了^$#%%^这类乱七八糟的东西的时候 用上面的就解析不出来了


QUOTE:
原帖由 hdc1112 于 2008-7-24 14:04 发表
可能空白页在[^a]之中~
但是如果不能以b结尾呢,怎么进行字符集的减运算,请指教

好像有一个断言可以实现这样的操作 但就是不知道怎么搞
$_ = "saaaaa sdjfzv  saata saaaaaaat swjfsd skdfje";
my @t = /\b(s\w+[b-zB-Z])\b/g;

[^a] 就不成


QUOTE:
原帖由 cobrawgl 于 2008-7-24 14:45 发表
$_ = "saaaaa sdjfzv  saata saaaaaaat swjfsd skdfje";
my @t = /\b(s\w+)\b/g;

[^a] 就不成

如果其中包含乱字符你准备咋搞