Mysql REGEX用于检测长行

时间:2010-11-23 20:46:49

标签: mysql regex formatting

我的数据库中有一些看起来像这样的记录:

Lorem ipsum dolor sit amet, consectetur adipiscing elit.......
<PRE>
one short line
an other short line
a very long line I want to detect with more than 80 caracterssssssssssssssssss
again some short lines
</PRE>
Nullam tristique nisl eu lacus fringilla porta. ........

我想检测PRE代码中的长行(&gt; 80个字符),然后我会手动编辑它们。

我试过这样的事情

SELECT * FROM table WHERE column 
    REGEXP "<PRE>.*[\n\r]+[^\n\r]{80,}[\n\r]+.*</PRE>"

但它返回没有长行的记录。

有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:1)

使用.*?代替.*,因此正则表达式解析器不贪婪

答案 1 :(得分:1)

[^\n\r]{80,}不一定与PRE元素中开始搜索的行匹配。 .*可以匹配结束</PRE>标记以及其他标记,因此如果存在一个,则长行可以在另一个PRE元素中,或者甚至在PRE元素之间的文本中。

我不认为有一种防弹方式可以在MySQL中执行您想要的操作,但您可以尝试这样做:

<PRE>[^<]*[\n\r][^\n\r<]{80,}

你已经说过PRE元素中不会有任何其他标记,因此其内容中的任何尖括号都应采用&lt;等转义序列的形式,并且第一个{{1}正则表达式遭遇应该是<标记中的一个。

这是一个黑客,但没有前瞻,这是我能想到的唯一方法将匹配限制在同一个PRE元素中。要完成这项工作正确,你应该在MySQL之外完成。

答案 2 :(得分:0)

如果可能有多个<PRE>块,则表达式可以吞噬它们之间的空间。将[^\n\r]{80,}更改为[^\n\r]{80,}?

答案 3 :(得分:0)

<PRE>\s*[^\n\r]{80,}.*?</PRE>

请注意,这假定</PRE>标记永远不会与内容位于同一行。 (如果确实如此,你可以使用74个字符的'long line',然后是结束标记,然后你会消耗很多内容直到下一个结束标记。)