Я знаю, что опоздал на эту вечеринку, но есть несколько проблем с регулярным выражением, которые существующие ответы не решают.Первый и самый раздражающий, это тот лес обратной косой черты.Если вы используете дословные строки C #, вам не нужно делать все это двойное экранирование.И вообще, во-первых, большинство обратных слешей не были нужны.
Во-вторых, есть бит: ([\\w+?\\.\\w+])+
.Квадратные скобки образуют класс символов, и все внутри них рассматривается либо как буквенный символ, либо как сокращение класса, например \w
.Но избавиться от квадратных скобок недостаточно, чтобы заставить его работать.Я подозреваю, что это то, что вы пытались: \w+(?:\.\w+)+
.
В-третьих, квантификаторы в конце регулярного выражения - ]*)?
- не совпадают.*
может соответствовать нулю или более символов, поэтому нет смысла делать дополнительную группу включающей.Кроме того, такая компоновка может привести к серьезному снижению производительности.Подробнее см. на этой странице .
Существуют и другие незначительные проблемы, но я сейчас не буду их обсуждать.Вот новое и улучшенное регулярное выражение:
@"(?n)(https?|ftps?)://\w+(\.\w+)+([-a-zA-Z0-9~!@#$%^&*()_=+/?.:;',\\]*)(?![^<>]*+(>|</a>))"
Отрицательный прогноз - (?![^<>]*+(>|</a>))
- это то, что предотвращает совпадения внутри тегов или в содержимом элемента привязки.Это все еще очень грубо, хотя.Есть несколько областей, например, внутри <script>
элементов, где вы не хотите, чтобы они совпадали, но это так.Но попытка охватить все возможности привела бы к регулярному выражению длиной в милю.