    async def _has_watch_regex_match(self, text: str) -> Tuple[Union[bool, re.Match], Optional[str]]:
        """
        Return True if `text` matches any regex from `word_watchlist` or `token_watchlist` configs.

        `word_watchlist`'s patterns are placed between word boundaries while `token_watchlist` is
        matched as-is. Spoilers are expanded, if any, and URLs are ignored.
        Second return value is a reason written to database about blacklist entry (can be None).
        """
        if SPOILER_RE.search(text):
            text = self._expand_spoilers(text)

        text = self.clean_input(text)

        # Make sure it's not a URL
        if URL_RE.search(text):
            return False, None

        watchlist_patterns = self._get_filterlist_items('filter_token', allowed=False)
        for pattern in watchlist_patterns:
            match = re.search(pattern, text, flags=re.IGNORECASE)
            if match:
                return match, self._get_filterlist_value('filter_token', pattern, allowed=False)['comment']

        return False, None
The product receives input or data, but it does
        not validate or incorrectly validates that the input has the
        properties that are required to process the data safely and
        correctly.