#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 ах, да, это было намного лучше. С небольшой модификацией, я думаю, теперь все работает нормально. Я обновил вопрос с помощью запроса, который я считаю хорошим. Спасибо.