Mysql REGEX для обнаружения длинных линий - PullRequest
0 голосов
/ 23 ноября 2010

У меня есть несколько записей в моей базе данных, которые выглядят так:

Lorem ipsum dolor sit amet, consectetur adipiscing elit.......

one short line
an other short line
a very long line I want to detect with more than 80 caracterssssssssssssssssss
again some short lines
Nullam tristique nisl eu lacus fringilla porta.........

Я хотел бы обнаружить длинные строки (> 80 символов) внутри тегов PRE, а затем отредактирую их вручную.

Iпопробовал что-то вроде этого

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

, но он возвращает записи там, где нет длинных строк.

Может кто-нибудь направить меня в правильном направлении?

Ответы [ 4 ]

1 голос
/ 24 ноября 2010

[^\n\r]{80,} не обязательно соответствует строке в элементе PRE, где он начинает поиск..* может соответствовать закрывающему тегу </PRE> и далее, поэтому длинная строка может быть в другом элементе PRE, если он есть, или даже в тексте между элементами PRE.

Я недумаю, что в MySQL есть пуленепробиваемый способ сделать то, что вы хотите, но вы можете попробовать это:

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

Вы сказали, что внутри элемента PRE не будет никакой другой разметки, так что под любым угломСкобка в ее содержимом должна быть в виде escape-последовательности, такой как &lt;, а первая <, с которой встречается регулярное выражение, должна быть в теге </PRE>.

Это взлом, но без опозданий, это единственный способ ограничить совпадение одним и тем же элементом PRE.Чтобы сделать эту работу правильно , вы должны делать это вне MySQL.

1 голос
/ 23 ноября 2010

Используйте .*? вместо .*, чтобы анализатор регулярных выражений не был жадным

0 голосов
/ 24 ноября 2010
\s*[^\n\r]{80,}.*?

Обратите внимание, что это предполагает, что тег </PRE> никогда не находится в той же строке, что и содержимое.(Если это произойдет, вы можете использовать 74 символа «длинной строки», за которыми следует закрывающий тег, а затем вы будете использовать много контента вплоть до следующего закрывающего тега.)

0 голосов
/ 23 ноября 2010

Если может быть более одного <PRE> блока, ваше выражение может проглотить пространство между ними.Измените [^\n\r]{80,} на [^\n\r]{80,}?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...