【发布时间】:2011-10-10 13:11:52
【问题描述】:
我正在尝试在字符串中查找(并替换)重复的字符串。
我的字符串可能如下所示:
Lorem ipsum dolor sit amet sit amet sat amet sit nostrud exercitation amit sit ullamco laboris nisi ut aliquip ex ea commodo consequat。
这应该变成:
Lorem ipsum dolor sit amet sit nostrud exercitation amit sit ullamco laboris nisi ut aliquip ex ea commodo consequat。
注意 amit sit 是如何没有被删除的,因为它没有重复。
或者字符串可以是这样的:
Lorem ipsum dolor sit amet () sat amet () sat amet () 坐 nostrud exercitation ullamco laboris nisi ut aliquip aliquip ex ea commodo consequat。
应该变成:
Lorem ipsum dolor sit amet () sit nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
所以它不仅是 a-z,还可以有其他 (ascii) 字符。如果有人可以帮助我,我很高兴。
下一步是匹配(和替换)如下内容:
2个问题3个问题4个问题5个问题
会变成:
2 个问题
最终输出中的数字可以是任意数字2,3,4,没关系。最后一个例子中只有数字不同,但单词是一样的。
【问题讨论】:
-
为什么第一段第二个
sit没有去掉?它仍然是第一个sit的重复。我们如何才能正确确定单词边界? -
因为它不重复直接。所以在
one two one中没有重复,但它在one one two中。这能回答你的问题吗? -
这仅适用于文字吗?然后定义什么是单词,因为
()显然不是。我在上面引用了 tandu,“我们如何才能正确确定单词边界?” 您希望从这些示例中得到什么结果:foo foo.、foo foobar、foo foo-foo、@987654329 @、#¤% #¤% #¤%、#¤%#¤%#¤%. -
因为喝了这么多,没想到正则表达式可能没这么简单……
-
我认为你的前两个例子是错误的;要减少的字符串不是“... sat amet sat amet sat amet sat ...”而是“... sit amet sat amet sat amet sat ... ”。所以重复的字符串是sec amet,而不是amet sic。 (生成的recuntion看起来相同,但逻辑不同)。
标签: php regex perl string-search