Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式:匹配所有重复字符_Php_Regex - Fatal编程技术网

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

Php 正则表达式:匹配所有重复字符,php,regex,Php,Regex,我想匹配字符串中所有重复出现的字符。因此,如果我有: 艾克费德 正则表达式应该匹配所有字符,除了c和d(导致这些字符只出现一次) 现在我已经有了这个,它匹配字符串中稍后出现的所有字符 /([a-z])(?=.*\1)/g 它与以下粗体字符匹配: aecffead 但它应该匹配这些粗体字符:aecffead 我的正则表达式与最后一个“fea”不匹配,因为这些字符以后不会出现在字符串中。但因为它们已经发生了,所以我也要匹配它们 有人知道如何解决这个问题吗?我想把积极的展望与积极的展望结合起来,但我

我想匹配字符串中所有重复出现的字符。因此,如果我有:

艾克费德

正则表达式应该匹配所有字符,除了
c
d
(导致这些字符只出现一次)

现在我已经有了这个,它匹配字符串中稍后出现的所有字符

/([a-z])(?=.*\1)/g
它与以下粗体字符匹配: aecffead

但它应该匹配这些粗体字符:aecffead

我的正则表达式与最后一个“fea”不匹配,因为这些字符以后不会出现在字符串中。但因为它们已经发生了,所以我也要匹配它们

有人知道如何解决这个问题吗?我想把积极的展望与积极的展望结合起来,但我无法做到

编辑:

我想澄清一下:
其思想是删除所有出现多次的字符。因此,不仅重复,而且如果字符
a
出现多次,我想从字符串中删除所有
a
字符。

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

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

array (
  0 => 'c',
  1 => 'd',
)
它将值计数作为数组,然后使用
array\u intersect()
仅保留出现一次的值,然后将键转换为零索引数组的值

此外,您还可以使用
内爆()

例如:


编辑:或者,您可以尝试(使用您的正则表达式模式):


示例:

这看起来不像是一个应该用PCRE正则表达式解决的问题。你需要一个无限宽度的后视。你的正则表达式有一个限制,即一个字符的最终出现永远不会与正则表达式模式匹配,因为该字符永远不会出现进一步的重复。更新:基于Wikor的注释,也许你应该考虑类似于按字符迭代字符串和用其他方法检查重复逻辑。也许这个答案有帮助:注意,这不会考虑看起来相同但实际上不同的字符,例如来自不同字符集的字符,等等,比如Crylic
a
和latin
a
。同意!您需要一些固定大小的宽度来检测。要寻找的范围是什么?直到你的字符串出现多长时间?相当多的函数,但它做得很完美!所以谢谢你!:)尽管它不像我问的那样是正则表达式,但我会接受这个答案,因为这是迄今为止唯一(也是最好)返回我要求的结果的答案。我使用您的模式添加了另一个方法,似乎效果很好。我想这比第一个解决方案好
$string = "aecffead";

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

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