【问题标题】:Regex match that must contain all characters in a string必须包含字符串中所有字符的正则表达式匹配
【发布时间】:2011-05-02 00:25:27
【问题描述】:

我确定这已经被问及回答了,但老实说,在搜索了相当多的内容并阅读了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  

【问题讨论】:

    标签: php regex string string-comparison anagram


    【解决方案1】:

    基本上你正在检查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

    【讨论】:

    • 卫生署!谢谢很有意义,我想我的思绪停留在正则表达式上,掉进了兔子洞。谢谢。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2022-01-12
        • 2022-01-15
        • 1970-01-01
        • 2016-04-21
        • 2015-05-12
        • 1970-01-01
        • 2019-10-07
        相关资源
        最近更新 更多