2010-08-13 47 views
2

嗨,有没有什么办法可以用其他方法来替换mysql表中10个或更多的_(下划线)出现的所有事件。Mysql替换正则表达式

背景 我已经继承了为网络编写的内容数据库。

不幸的是,原始作者已经使用________________而不是<hr />作为横向规则。

这是一个WordPress的安装,所以内容在一个名为wp_posts的表中。

我能找到涉及以下查询的帖子。

SELECT * 
FROM `wp_posts` 
WHERE `post_content` LIKE '%\_\_\_\_\_\_\_\_\_\_%' 

更新:

我可以找到使用下面还

SELECT `post_content` 
REGEXP '_{10,}' 
FROM `wp_posts` 
WHERE `post_content` LIKE '%\_\_\_\_\_\_\_\_\_\_%' 
LIMIT 0 , 30 

然而,只有返回1相匹配的职位,如果那里有一个比赛不是0,如果没有。

有没有什么办法可以返回匹配的子字符串? 有没有办法让表达贪婪?

+0

@Dominic罗杰什么是错误的帖子你编辑它?只是想知道我做错了什么,以免再次发生。 – Wes 2010-08-13 12:56:18

+0

没什么太严重的(几个拼写错误,你需要反驳'


' - 它没有出现在你的原始文章中)。这里的人倾向于编辑东西来整理它们 - 它不一定反映在你身上,作为问题提问者/回答者 - 本网站是协作编辑的(参见FAQ:http://stackoverflow.com/faq) – 2010-08-13 13:08:25

回答

4

MySQL没有正则表达式替换,但你可以在没有它的情况下做你想做的事情。

您可以使用REPLACE更换一个确切的字符串:

update `wp_posts` set `post_content` = replace(`post_content`,'__________','<hr />'); 

由于这是一次性的工作,我会通过寻找用于表示<hr />_史上最高计数开始 - 如果这是15,我首先运行该SQL命令与一个字符串与15 _ s,然后与14,然后与13,然后与......,然后与10.

+0

好的这是有用的,但我担心原作者只是按住了他们认为合适的长度。 虽然我可以使用正则表达式来找到这些lengts并将其传递给它。我会放弃这一点。 – Wes 2010-08-13 12:55:38

+0

如果使用正则表达式真的很重要,你可以将它作为插件安装在mysql中,请点击此处:http://www.mysqludf.org/lib_mysqludf_preg/ – 2010-08-13 12:58:56

+0

好的这种为我工作。但是我必须再次完成这项工作,我很想看到一个更清晰的解决方案 – Wes 2010-08-13 14:34:17