Самый хороший способ сделать это - использовать отрицательный взгляд назад (на языках, которые их поддерживают):
/(?>http:\/\/[^\s]*)(?<!\.dtd)/g
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * назад и соответствуя меньше.
(<!\.dtd)
- это отрицательный вид сзади, который совпадает только в том случае, если \.dtd
не совпадает с окончанием в этой позиции (т. Е. URL не заканчивается на .dtd
).
Для языков, которые этого не делают (например, JavaScript), вы можете вместо этого использовать отрицательный прогноз, который немного уродлив и, как правило, менее эффективен:
/(http:\/\/(?![^\s]*\.dtd\b)[^\s]*)/g
Будет соответствовать http://
, затем сканировать вперед, чтобы убедиться, что он не заканчивается на .dtd
, затем вернуться назад и снова сканировать вперед, чтобы получить фактическое совпадение.
Как всегда, http://www.regular -expressions.info / является хорошим справочным материалом для получения дополнительной информации