我的数据库中有一些看起来像这样的记录:
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>"
但它返回没有长行的记录。
有人能指出我正确的方向吗?
答案 0 :(得分:1)
使用.*?
代替.*
,因此正则表达式解析器不贪婪
答案 1 :(得分:1)
[^\n\r]{80,}
不一定与PRE元素中开始搜索的行匹配。 .*
可以匹配结束</PRE>
标记以及其他标记,因此如果存在一个,则长行可以在另一个PRE元素中,或者甚至在PRE元素之间的文本中。
我不认为有一种防弹方式可以在MySQL中执行您想要的操作,但您可以尝试这样做:
<PRE>[^<]*[\n\r][^\n\r<]{80,}
你已经说过PRE元素中不会有任何其他标记,因此其内容中的任何尖括号都应采用<
等转义序列的形式,并且第一个{{1}正则表达式遭遇应该是<
标记中的一个。
这是一个黑客,但没有前瞻,这是我能想到的唯一方法将匹配限制在同一个PRE元素中。要完成这项工作正确,你应该在MySQL之外完成。
答案 2 :(得分:0)
如果可能有多个<PRE>
块,则表达式可以吞噬它们之间的空间。将[^\n\r]{80,}
更改为[^\n\r]{80,}?
。
答案 3 :(得分:0)
<PRE>\s*[^\n\r]{80,}.*?</PRE>
请注意,这假定</PRE>
标记永远不会与内容位于同一行。 (如果确实如此,你可以使用74个字符的'long line',然后是结束标记,然后你会消耗很多内容直到下一个结束标记。)