Соответствие регулярному выражению, которое должно содержать все символы в строке - PullRequest
2 голосов
/ 28 октября 2010

Я уверен, что об этом уже спрашивали и отвечали, но я, честно говоря, не смог найти свой ответ после долгого поиска и чтения 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  

Ответы [ 3 ]

7 голосов
/ 28 октября 2010

В основном вы проверяете анаграммы . Почему бы не отсортировать строки и сравнить на равенство?

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

Код в действии

0 голосов
/ 28 октября 2010

В качестве альтернативы использованию регулярного выражения, вы можете преобразовать каждую букву в символ, затем отсортировать их и проверить, совпадают ли эти две строки.

0 голосов
/ 28 октября 2010

Я не уверен, что вы захотите использовать Regex в этом. Я думаю, что вы захотите использовать простое старое утверждение для всех ваших писем.

...