diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index c96cc3e24d6700df780ee2b202955b17c85c10fe..e4bad8b7975c07d66a91d07ec12d73162ae4c0e3 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -126,6 +126,8 @@ dependencies {
   }
   implementation(project(":malheur"))
 
+  implementation("org.jetbrains", "annotations", "15.0")
+
   testImplementation(appArch("persistence.room", "testing", "1.0.0"))
   testImplementation("junit", "junit", "4.12")
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt
index b5a9a7c85d5ec2388ed04be06501e442118933ca..006257714f27e3ea3d270bff80eef9d6c91f8263 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt
@@ -21,6 +21,7 @@ import de.kuschku.quasseldroid_ng.util.helper.styledAttributes
 import de.kuschku.quasseldroid_ng.util.irc.format.IrcFormatDeserializer
 import de.kuschku.quasseldroid_ng.util.quassel.IrcUserUtils
 import de.kuschku.quasseldroid_ng.util.ui.SpanFormatter
+import org.intellij.lang.annotations.Language
 import org.threeten.bp.ZoneId
 import org.threeten.bp.format.DateTimeFormatter
 import java.text.SimpleDateFormat
@@ -230,14 +231,20 @@ class QuasselMessageRenderer(
     }
   }
 
+  @Language("RegExp")
   private val scheme = "(?:(?:mailto:|(?:[+.-]?\\w)+://)|www(?=\\.\\S+\\.))"
-  private val authority = "(?:(?:[,.;@:]?[-\\w]+)+\\.?|\\[[0-9a-f:.]+\\])(?::\\d+)?"
+  @Language("RegExp")
+  private val authority = "(?:(?:[,.;@:]?[-\\w]+)+\\.?|\\[[0-9a-f:.]+])(?::\\d+)?"
+  @Language("RegExp")
   private val urlChars = "(?:[,.;:]*[\\w~@/?&=+$()!%#*-])"
+  @Language("RegExp")
   private val urlEnd = "((?:>|[,.;:\"]*\\s|\\b|$))"
+
   private val urlPattern = Regex(
-    String.format("\\b(%s%s(?:/%s*)?)%s", scheme, authority, urlChars, urlEnd),
+    "\\b($scheme$authority(?:/$urlChars*)?)$urlEnd",
     RegexOption.IGNORE_CASE
   )
+
   private val channelPattern = Regex(
     "((?:#|![A-Z0-9]{5})[^,:\\s]+(?::[^,:\\s]+)?)\\b",
     RegexOption.IGNORE_CASE
@@ -248,10 +255,13 @@ class QuasselMessageRenderer(
       ircFormatDeserializer.formatString(content, renderingSettings.colorizeMirc)
     )
     for (result in urlPattern.findAll(content)) {
-      text.setSpan(
-        URLSpan(result.value), result.range.start, result.range.start + result.value.length,
-        Spanned.SPAN_INCLUSIVE_INCLUSIVE
-      )
+      val group = result.groups[1]
+      if (group != null) {
+        text.setSpan(
+          URLSpan(group.value), group.range.start, group.range.start + group.value.length,
+          Spanned.SPAN_INCLUSIVE_EXCLUSIVE
+        )
+      }
     }
     /*
     for (result in channelPattern.findAll(content)) {