2

我确信这已经被问到并得到了回答,但老实说,在搜索了相当多的内容并阅读了Regex Tutorial之后,我找不到我的答案。我要做的是匹配一个与另一个字符串具有相同字符和长度的字符串。例如,字符串"abcde"将匹配"edcba"但不会匹配"abcdf""aabbc""abc"

这是我的测试代码,最接近我想出的使用字符类的代码,但我不知道如何让正则表达式从匹配开始时基本上遍历类中的每个字符细绳:

$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  
4

3 回答 3

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);
}

代码在行动

于 2010-10-28T17:23:52.250 回答
0

我不确定您是否想在此使用 Regex。我认为您会希望对所有信件使用普通的旧 find 语句。

于 2010-10-28T17:23:39.970 回答
0

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

于 2010-10-28T17:24:41.980 回答