【问题标题】:Remove repeating character删除重复字符
【发布时间】:2011-10-07 02:14:52
【问题描述】:

如何删除重复字符(例如,删除 cakkkke 中的字母 k 使其变为 cake)?

执行此操作的一种直接方法是遍历字符串的每个字符,如果该字符不是前一个字符的重复,则将字符串的每个字符附加到新字符串。

这里有一些代码可以做到这一点:

$newString = '';
$oldString = 'cakkkke';
$lastCharacter = '';
for ($i = 0; $i < strlen($oldString); $i++) {
    if ($oldString[$i] !== $lastCharacter) {
        $newString .= $oldString[$i];
    }
    $lastCharacter = $oldString[$i];
}
echo $newString;

有没有办法使用正则表达式或内置函数更简洁地做同样的事情?

【问题讨论】:

  • 你对look,free,tree这样的词有什么期望?
  • @Lawrence Cherone :我希望它仅在字符出现超过 n 次时才替换。我通常会将 n 值设置为 4 或更高
  • @Lawrence Cherone - 是的,我可以发挥价值,看看什么最适合。

标签: php regex


【解决方案1】:

使用反向引用

echo preg_replace("/(.)\\1+/", "$1", "cakkke");

输出:

cake

解释:

(.) 捕获任何字符

\\1 是对第一个捕获组的反向引用。在这种情况下,上面的.

+ 使反向引用至少匹配 1 个(因此它匹配 aa、aaa、aaaa,但不匹配 a)

在这种情况下,用$1 替换它会替换完全匹配的文本kkk,在这种情况下用第一个捕获组k

【讨论】:

  • 很好用,您能否通过解释正则表达式来进一步提供帮助。我不明白它是如何工作的:斜线? 1? +?
  • @Imran,检查我更新的答案。如果还有什么不清楚的地方,请随时提问。
  • 如果字符出现超过 n 次,我该如何更改为仅替换?
  • 请注意此正则表达式不考虑国际字符。
  • 在此链接中查看此答案的一个非常有趣的变体:randomdrake.com/2008/04/10/…。它是 preg_replace('{(.)\1+}', ...)。你看到了吗:没有两个斜线包围模式字符串。
【解决方案2】:

您要先匹配一个字符,然后再匹配该字符:(.)\1+。将其替换为第一个字符。 brackets 创建对第一个字符的反向引用,您可以使用它来匹配重复的实例并用作替换文本。

preg_replace('/(.)\1+/', '$1', $str);

【讨论】:

    【解决方案3】:

    使用此正则表达式 "(.)\\1+" 并替换为 $1

    不太懂php,但是会用C#:

    Console.WriteLine(Regex.Replace("cakkkkeee", "(.)\\1+", "$1"));
    

    【讨论】:

    • 这个答案在某种程度上与 this 特定问题无关。尽管该模式适用。
    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2011-09-26
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多