急。求一个正则表达式,实在想不清楚了。。。

my @str = ("abcd", "bcda", "bbac", "dcba", "aaabbbd", "cdab");

for (@str) {
    print "$_\n" if /^(?!.*([abcd]).*\1)[abcd]{4}$/;
}


QUOTE:
原帖由 ynchnluiti 于 2008-10-31 09:56 发表
my @str = ("abcd", "bcda", "bbac", "dcba", "aaabbbd", "cdab");

for (@str) {
    print "$_\n" if /^(?!.*([abcd]).*\1)[abcd]{4}$/;
}

如果数据中有其他字符,例如"123abcd",你这个就不行了。
感觉还是分开2步写简单:
print "$_\n" if !/([abcd]).*\1/ && /[abcd]{4}/
use strict;
my @tmp_string;
my $patten;
foreach $patten (<> =~ /(\w{4})/g) {
    @tmp_string = split //,$patten;
    @tmp_string = sort @tmp_string;
    @tmp_string = $tmp_string[0]..$tmp_string[-1];
if (@tmp_string == 4) {
#    s/$object/'$object'/

    print "success!\n";
} else {
    print "there is not a matching!\n";
}
}

我试了这个方法,有时会出错,哪位帮忙改一下?


QUOTE:
原帖由 qishking 于 2008-10-31 15:41 发表
use strict;
my @tmp_string;
my $patten;
foreach $patten ( =~ /(\w{4})/g) {
    @tmp_string = split //,$patten;
    @tmp_string = sort @tmp_string;
    @tmp_string = $tmp_string[0]..$tmp_str ...

为什么遇到这样的字符串就会出错呢?
1324zzzacbde

它只会匹配1324 ... cbde,而不是1324 ... acbd ..呢?

高手帮忙改一下这龌龊的代码..


QUOTE:
原帖由 qishking 于 2008-10-31 15:41 发表
use strict;
my @tmp_string;
my $patten;
foreach $patten ( =~ /(\w{4})/g) {
    @tmp_string = split //,$patten;
    @tmp_string = sort @tmp_string;
    @tmp_string = $tmp_string[0]..$tmp_str ...

都说过了你不听嘛,干嘛非要用正则表达式呢?出错了不是?

foreach $patten ( =~ /(\w{4})/g) {

你这里每次肯定要吃掉四个字符,
所以 1324zzzacbde 这个每次判断的是 1324, zzza, cbde
根本就没有acbd嘛。

直接用 for $i (0..length($_)) { $str = substr($_, $i, 4); ...} 不好吗?


QUOTE:
原帖由 ly5066113 于 2008-10-31 14:15 发表


如果数据中有其他字符,例如"123abcd",你这个就不行了。
感觉还是分开2步写简单:
print "$_\n" if !/([abcd]).*\1/ && /[abcd]{4}/

去掉^ 和 $

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl -w
use warnings;
use strict;

my @str = qw(
        123abcd49
        234aabbde98
        123aabbccdd98
        1234dcba
        123abcd
        123abcd45
        123abgg45
        1234dcbaggg
        1234abcd
        123a4b5c6d90
        123ab4bc5cd6d90
        123ab4bc5cdgggasdb
        123ab4bc5cdbaggasdb
        12a4abcdggg
        1234dcbaaggg
        1234dbac
        );

print 'Strings that match "/(?!.*([abcd]).*\1)[abcd]{4}/":', "\n";
for (@str) {
    print "$_\n" if /(?!.*([abcd]).*\1)[abcd]{4}/;
}

print 'Strings that match "!/([abcd]).*\1/ && /[abcd]{4}/":', "\n";
for (@str) {
    print "$_\n" if !/([abcd]).*\1/ && /[abcd]{4}/;
}



QUOTE:
Strings that match "/(?!.*([abcd]).*\1)[abcd]{4}/":
123abcd49
1234dcba
123abcd
123abcd45
1234dcbaggg
1234abcd
12a4abcdggg
1234dbac
Strings that match "!/([abcd]).*\1/ && /[abcd]{4}/":
123abcd49
1234dcba
123abcd
123abcd45
1234dcbaggg
1234abcd
1234dbac



QUOTE:
原帖由 ynchnluiti 于 2008-11-1 00:14 发表

Strings that match "/(?!.*([abcd]).*\1)[abcd]{4}/":
123abcd49
1234dcba
123abcd
123abcd45
1234dcbaggg
1234abcd
12a4abcdggg
1234dbac

这个 12a4abcdggg 没过滤掉。


QUOTE:
原帖由 ly5066113 于 2008-11-1 09:23 发表


这个 12a4abcdggg 没过滤掉。

嗯,不太否符合条件。连续的是abcd

QUOTE:
要求abcd四个字母连续,但每个字母有且仅出现一次

如果要求不重复的话,用正则表达式确实有点困难
邮件列表里有一个
my @result = glob "{a}-{b,c}-{d,e,f}-{a}";