必须包含字符串中所有字符的正则表达式匹配

时间:2010-10-28 17:12:00

标签: php regex string string-comparison anagram

我确信这已经被问到并得到了答复,但是我真的找不到我的答案后再搜索Regex Tutorial。我要做的是匹配一个字符串,其长度与另一个字符串相同。例如,字符串“abcde”将匹配“edcba”但不匹配“abcdf”“aabbc”“abc”

这是我最接近的测试代码,它使用了一个字符类,但是我无法弄清楚的是如何让regex基本上从一开始就迭代遍历每个字符匹配字符串:

$string = 'abcde';
$array  = array('edcba','eeeee','fghij','fedcba','qqq','cbaed','cba');
foreach ($array as $match)
{
    if (preg_match("/[$string]/i",$match))
        echo "TRUE  -> $match";
    else 
        echo "FALSE -> $match";
}

结果如下:

TRUE  -> edcba
TRUE  -> eeeee
FALSE -> fghij
TRUE  -> fedcba
FALSE -> qqq
TRUE  -> cbaed
TRUE  -> cba 

当我真正想要的是:

TRUE  -> edcba 
FALSE -> eeeee  
FALSE -> fghij  
FALSE -> fedcba 
FALSE -> qqq    
TRUE  -> cbaed  
FALSE -> cba  

3 个答案:

答案 0 :(得分:7)

基本上你正在检查anagrams。为什么不对字符串进行排序并比较相等?

$string = 'abcde';
$string = str_sort($string);  // sort the string.
$array  = array('edcba','eeeee','fghij','fedcba','qqq','cbaed','cba');
foreach ($array as $match) {
        $match = str_sort($match);  // sort each match.
        if (strcmp($match,$string) == 0)  // now string compare.
                echo "TRUE  -> $match\n";
        else
                echo "FALSE -> $match\n";
}

function str_sort($string) {
// function to sort a string..not the best but works :) 
        $tmp = str_split($string);
        sort($tmp);
        return implode('',$tmp);
}

Code In Action

答案 1 :(得分:0)

我不确定你是否想在此使用正则表达式。我想你会想要为你的所有信件使用一个简单的旧陈述声明。

答案 2 :(得分:0)

作为使用正则表达式的替代方法,您可以将每个字母转换为字符然后对它们进行排序并检查两个标记是否相等。