регулярное выражение: как удалить URL, заканчивающиеся на .dtd - PullRequest
3 голосов
/ 31 марта 2010

Это регулярное выражение JavaScript.

regex = /(http:\/\/[^\s]*)/g;

text = "I have http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd and I like http://google.com a lot";

matches = text.match(regex);

console.log(matches);

Я получаю оба URL в результате. Однако я хочу исключить все URL, заканчивающиеся на .dtd. Как мне это сделать?

Обратите внимание, что я говорю, что конец .dtd должен быть удален. Это означает, что URL-адрес типа http://a.dtd.google.com должен пройти.

1 Ответ

3 голосов
/ 31 марта 2010

Самый хороший способ сделать это - использовать отрицательный взгляд назад (на языках, которые их поддерживают):

/(?>http:\/\/[^\s]*)(?<!\.dtd)/g

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * назад и соответствуя меньше.

(<!\.dtd) - это отрицательный вид сзади, который совпадает только в том случае, если \.dtd не совпадает с окончанием в этой позиции (т. Е. URL не заканчивается на .dtd).

Для языков, которые этого не делают (например, JavaScript), вы можете вместо этого использовать отрицательный прогноз, который немного уродлив и, как правило, менее эффективен:

/(http:\/\/(?![^\s]*\.dtd\b)[^\s]*)/g

Будет соответствовать http://, затем сканировать вперед, чтобы убедиться, что он не заканчивается на .dtd, затем вернуться назад и снова сканировать вперед, чтобы получить фактическое совпадение.

Как всегда, http://www.regular -expressions.info / является хорошим справочным материалом для получения дополнительной информации

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