У меня есть белый список конечных тегов HTML (br
, b
, i
, div
): -Почему регулярное выражение соответствует строке, когда другие присутствуют?
String whitelist = "([^br|^b|^i|^div])";
String endTagPattern = "(<[ ]*/[ ]*)" + whitelist + "(>?).*?([^>]+>)";
...
html = html.replaceAll(endTagPattern, "[r]");
Который берет мой тест String
и удаляет конечные теги тех, кто не в белом списке, в этом случае заменен [r]
для ясности: -
1. <b>bold</b>, 2. <i>italic</i>, 3. <strong>strong</strong>, 4. <div>div</div>, 5. <script lang='test'>script</script>
1. <b>bold</b>, 2. <i>italic</i>, 3. <strong>strong[r], 4. <div>div</div>, 5. <script lang='test'>script[r]
Если добавить strong
в этот белый список
String whitelist = "([^br|^b|^i|^div|^strong])";
Он не только не совпадает с конечным тегом strong
, но также останавливается, соответствуя теге конца script
или любому другому в этом отношении.
Мой вопрос: почему?
[Этот ответ может быть уместным] (http://stackoverflow.com/a/1732454/2071828). Вы также не понимали, как работает регулярное выражение - шаблон '[^ br |^b |^i |^div |^strong]' является группой символов, которая соответствует ** не ** 'b' или' r' или '| 'или' d' или 'i' и т. д. ... –
Я понимаю, что синтаксический анализ HTML любым сложным способом является болезненным, если не невозможным, но должно быть возможно удалить теги здесь и там нет? –
(1) Использование HTML и регулярное выражение - действительно плохая идея. Вместо этого вы должны использовать парсер. (2) Кажется, вы путаете [группы] (http://www.regular-expressions.info/brackets.html) '(...)' и [классы символов] (http: //www.regular-expressions .info/charclass.html) '[...]'. – Pshemo