正则表达式:匹配所有重复的字符PHP

时间:2017-06-22 13:57:12

标签: php regex

我想匹配字符串中的所有重复字符。如果我有:

  

aecffead

除了cd之外,正则表达式应匹配所有字符(因为这些字符只出现一次)。

现在我已经拥有了这个,它匹配稍后将出现在字符串

中的所有字符
/([a-z])(?=.*\1)/g

它匹配这些粗体字符: 的 AE C ˚F FEAD

但它应符合这些大胆的字符: ae c ffea d

我的正则表达式与最后的" fea"不匹配,因为这些字符不会在字符串中稍后出现。但因为它们已经发生,我想也要匹配它们。

任何知道如何解决这个问题的人?我想过将积极的前瞻与积极的后视相结合,但我无法完成它。

修改

只是为了澄清: 我们的想法是删除多次出现的所有字符。所以不仅重复,但如果字符a出现不止一次,我想从字符串中删除所有a个字符。

1 个答案:

答案 0 :(得分:2)

您可以将字符串转换为数组:

$string = "aecffead";
var_export(array_keys(array_intersect(array_count_values(str_split($string)),[1])));

输出:

array (
  0 => 'c',
  1 => 'd',
)

这将值计为数组,然后使用array_intersect()仅保留出现一次的值,然后将键转换为零索引数组的值。

此外,您可以使用implode()

将数组转换回字符串

示例:https://eval.in/820930

编辑:或者你可以尝试这个(使用正则表达式模式):

$string = "aecffead";

preg_match_all('/([a-z])(?=.*\1)/', $string, $matches);

echo str_replace($matches[0], "", $string); //Output: cd

示例:https://eval.in/820969