【问题标题】:How to remove repeated chars from string but with exceptions like 'good' or 'cool'?如何从字符串中删除重复的字符,但有“好”或“酷”之类的例外?
【发布时间】:2016-07-15 23:47:04
【问题描述】:

我正在尝试从字符串中删除重复的字符,例如 我很喜欢这个。太棒了很好。

输出如下: 我喜欢这个。太棒了,非常好。

我已经在 PHP 中使用了这个指令 $str=preg_replace("/(.)\1+/", "$1", $str);

但它输出 我喜欢这个。这很棒。太神了。

问题在于已经应该包含重复字符的单词,例如“good”或“cool”

【问题讨论】:

  • 您只需要创建一个人工智能,它会为您校对并根据上下文确定需要使用哪个单词。
  • @TylerCollins 它不叫人工智能,它叫逻辑。
  • 也许是某种拼写检查库?
  • 我实际上觉得这与obscenity filters 以及随之而来的噩梦相提并论。

标签: php string duplicates chars


【解决方案1】:

由于您开始使用正则表达式,因此您可以继续使用正则表达式。

使用 negative look-behindnegative look-ahead 检查重复字母之前或之后是否有任何您不想匹配的内容。

$str = preg_replace('/(?<!g|c)(\w)\1+(?!d|l)/', '$1', $str);

不幸的是,这意味着要编写一个可能的前缀和后缀列表。

【讨论】:

    【解决方案2】:

    我想您可以将允许使用的单词(例如“good”和“cool”)存储在 Trie 字典中。

    当你检查一个单词是否有重复字符时,你应该允许重复字符直到字典仍然有一些带有该前缀的有效单词。

    当字典中没有前缀的有效单词时,您可以从该点删除重复的字符

    例如:如果您正在检查的单词是“Goooood”

    在 trie 中选中“Go”,它将返回“God”和“Good”作为有效词
    在 trie 中检查“Goo”,它将返回“Good”作为有效单词
    在 trie 中检查“Gooo”,它会说没有有效的单词

    因此,您保持“Goo”并删除其余的o

    【讨论】:

    • 您的解决方案不能解决我的所有问题,但可能会有所帮助。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2014-03-26
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多