【问题标题】:Search for repeated consecutive characters in strings and replace each string with 1 or 0搜索字符串中重复的连续字符并将每个字符串替换为 1 或 0
【发布时间】:2017-11-11 09:01:46
【问题描述】:

我有一个数组

$array = array("ab","aab","abb","abab","abaab","abbb");

我想搜索包含重复连续字符的元素,例如aababbabbb,并将它们替换为1

相反,如果一个元素不包含任何重复的连续字符(如ababab),则应将其替换为0

【问题讨论】:

    标签: php regex preg-replace repeat non-repetitive


    【解决方案1】:

    此方法使用 array_map 和 preg_match 根据重复字符串返回真/假匹配数组。键将匹配您的输入数组。

    (.) 找到任何字符并将其放入第一个捕获组,然后\1 确保其后出现完全匹配的字符。

    $array = array("ab","aab","abb","abab","abaab","abbb");
    function StringHasRepetition( $string )
    {
      return preg_match('/(.)\1/', $string);
    }
    $matches = array_map('StringHasRepetition',$array);
    print_r( $matches );
    // Array ( [0] => 0 [1] => 1 [2] => 1 [3] => 0 [4] => 1 [5] => 1 ) 
    

    作为 Lambda 函数:

    $array = array("ab","aab","abb","abab","abaab","abbb");
    $matches = array_map( function( $string ){
      return preg_match('/(.)\1/', $string);
    } ,$array);
    print_r( $matches );
    // Array ( [0] => 0 [1] => 1 [2] => 1 [3] => 0 [4] => 1 [5] => 1 )
    

    【讨论】:

    • 我起初误解了这个问题。很好的答案+1。完美的正则表达式模式。紧。
    • 谢谢,有时正则表达式是解决方案! :D
    • 我刚刚意识到一种更清洁的方式。看我的回答。 (我仍然喜欢你的,所以我不会取消投票。)
    【解决方案2】:

    preg_replace() 可以在一次调用中仅使用两个正则表达式模式来操作您的整个数组。首先将没有连续重复字符的字符串转换为0。然后将所有非0 值转换为1

    代码:(See Demo Link for a more verbose breakdown of the method)

    $array=["ab","aab","abb","abab","abaab","abbb",'1','11','10','0','00100','1101','01'];
    var_export(preg_replace(['/^(?:(.)(?!\1))*$/','/^(?!0$).*/'],[0,1],$array));
    

    输出:

    array (
      0 => '0',
      1 => '1',
      2 => '1',
      3 => '0',
      4 => '1',
      5 => '1',
      6 => '0',
      7 => '1',
      8 => '0',
      9 => '0',
      10 => '1',
      11 => '1',
      12 => '0',
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-06
      • 2019-03-28
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      相关资源
      最近更新 更多