字符串太长时正则表达式不起作用?

Regex not working when string is too long?

我有一段代码试图找到 URL 并将它们包装在 <a> 标签中。它适用于较短的字符串,但在较长的字符串上它根本不起作用。有谁知道为什么?

function urlify(text) {
        var urlRegex = `/(([a-z]+:\/\/)?(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&amp;]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi`
        return text.replace(urlRegex, function(url) {
            return '<a href="' + url + '">' + url + '</a>';
        });
    }

如果我 运行 urlify('www.example.com is a cool website') 它 returns <a href="www.example.com">www.example.com</a> is a cool website 但是如果我有一个有链接的 5000 个字符的字符串,它不会更改原始字符串全部.

这是同一正则表达式的更高效版本:

function urlify(text) {
    var urlRegex = /(?:[a-z]+:\/\/)?(?:[a-z\d-]+\.)+(?:a(?:ero|rpa)|biz|co(?:m|op)|edu|gov|in(?:ternal|fo|t)|jobs|m(?:il|useum)|n(?:a(?:me|to)|et)|org|pro|travel|local|[a-z]{2})(?::\d{1,5})?(?:\/[\w.~-]+)*(?:\/[\w.-]*(?:\?[\w+.%=&;-]*)?)?(?:#[\w!$&'()*+.=~:@\/?-]*)?(?!\S)/gi
    return text.replace(urlRegex, '<a href="$&">$&</a>');
}

参见regex demo

目前难以优化的部分是起始部分(?:[a-z]+:\/\/)?(?:[a-z\d-]+\.)+,因为它允许在字符串的任何位置匹配未知长度的模式,这涉及相当多的开销。如果您只想从空格或字符串开头开始匹配,开头的 (?<!\S) 会大大加快匹配速度。