Регулярное выражение MySQL для столбца с html

#mysql #sql #regex

#mysql #sql #регулярное выражение

Вопрос:

У меня есть таблица с содержимым HTML, в которой мне нужно выбрать все строки, содержащие элемент span, с помощью CSS-класса «glyphicon glyphicon-film» с некоторым текстовым содержимым, но исключить все строки без содержимого или просто содержащие пробел.

Эти строки не должны совпадать:

 <span class="glyphicon glyphicon-film">amp;nbsp;</span>
<span class="glyphicon glyphicon-film"></span>
<span class="glyphicon glyphicon-film"> </span>
<span class="hypo-link-target" data-link-target-id="1379">Hammartå</span>
  

Эти строки должны совпадать:

 <span class="glyphicon glyphicon-film">nån text</span>
<span class="glyphicon glyphicon-film">Nån Text</span>
<span class="glyphicon glyphicon-film">NÅN TEXT</span>
<span class="glyphicon glyphicon-film">amp;nbsp;nån text</span>
<span class="glyphicon glyphicon-film">amp;nbsp;Nån Text</span>
<span class="glyphicon glyphicon-film">amp;nbsp; nån text</span>
<span class="glyphicon glyphicon-film">amp;nbsp; Nån Text</span>
<span class="glyphicon glyphicon-film"> nån text</span>
<span class="glyphicon glyphicon-film"> Nån Text</span>
  

Запрос, который у меня есть на данный момент:

 select * from Section 
where (Text regexp '(span class="glyphicon glyphicon-film">amp;nbsp;. </span>)' 
or Text regexp 'span class="glyphicon glyphicon-film">[a-zA-Z][|å|ä|ö|Å|Ä|Ö] </span>');
  

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

ОБНОВЛЕНИЕ: основываясь на предложениях в ответе, я получил этот запрос, который, я думаю, работает для всех случаев. Этот запрос также будет соответствовать строкам с двумя или более элементами span, где некоторые элементы являются правильными, а некоторые — нет, например, этот:

 <span class="glyphicon glyphicon-film">amp;nbsp;Nån Text</span>more content here... and a correct span <span class="glyphicon glyphicon-film">amp;nbsp;</span>

select * from Section 
where Text regexp 'span class="glyphicon glyphicon-film">amp;nbsp;. </span>' 
        or (Text regexp 'span class="glyphicon glyphicon-film">[a-zA-ZåäöÅÄÖ ] </span>'
and Text not regexp 'span class="glyphicon glyphicon-film"> </span>');
  

Ответ №1:

Шаблон [a-zA-Z][|å|ä|ö|Å|Ä|Ö] соответствует строке, начинающейся с буквы ASCII, за которой следует любая смесь |åäöÅÄÖ . Вы хотите сопоставить строку с любой комбинацией этих символов, а также пробелов, которые вы пропустили. Это было бы [a-zA-ZåäöÅÄÖ ] .

| не используется внутри [] для указания альтернатив, поскольку [] уже указывает альтернативные символы.

 select * from Section 
where (Text regexp 'span class="glyphicon glyphicon-film">amp;nbsp;. </span>' 
        or Text regexp 'span class="glyphicon glyphicon-film">[a-zA-ZåäöÅÄÖ ] </span>')
and Text not regexp 'span class="glyphicon glyphicon-film">  </span>';
  

Последнее условие необходимо для <span class="glyphicon glyphicon-film"> </span> предотвращения сопоставления.

ДЕМОНСТРАЦИЯ

Комментарии:

1. Спасибо за совет, но это не сработало. С вашим изменением я получил совпадение только по строкам, содержащим «amp; nbsp; xxx», больше ничего.

2. «пробел» по-прежнему отсутствует в регулярном выражении.

3. @poa Я обновил ответ и добавил демонстрацию, показывающую, что он работает.

4. @Barmar ах, да, это было намного лучше. С небольшой модификацией, я думаю, теперь все работает нормально. Я обновил вопрос с помощью запроса, который я считаю хорошим. Спасибо.