正则表达式 - 匹配堆栈跟踪中的URL而不是后续行号

时间:2017-11-01 09:58:46

标签: javascript regex

所以我正在编写一个ASP.Net应用程序,它将轮询用于其他应用程序的日志数据库,并以易读的方式显示日志。我已经掌握了基本功能,但我希望" linkify" StackTrace中显示的URL,以便单击它们将打开相关文件。

at initialiseProducts (http://localhost:51940/POS/POS.js:520:22)
    at Object.success (http://localhost:51940/POS/POS.js:67:17)
    at i (http://localhost:51940/jquery-3.2.0.min.js:2:28017)
    at Object.fireWith [as resolveWith] (http://localhost:51940/jquery-3.2.0.min.js:2:28783)
    at A (http://localhost:51940/jquery-3.2.0.min.js:4:14017)
    at XMLHttpRequest. (http://localhost:51940/jquery-3.2.0.min.js:4:16305)

在对StackOverflow进行一些拖网之后,我发现了一个可以检测到我的网址而没有问题的正则表达式

/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig

但是它也会匹配URL末尾的行号和列号:520:22,这意味着当单击链接时,找不到该文件。

是否可以修改此Regex以忽略每个URL末尾的行号和列号?

1 个答案:

答案 0 :(得分:0)

这是您的正则表达式的修改版本,您可以从捕获中排除行号和列号,如下所示:

 (\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*):\d+:\d+

现场演示here

第1组包含您的网址。



const regex = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*?):\d+:\d+/ig;
const str = `at initialiseProducts (http://localhost:51940/POS/POS.js:520:22)
    at Object.success (http://localhost:51940/POS/POS.js:67:17)
    at i (http://localhost:51940/jquery-3.2.0.min.js:2:28017)
    at Object.fireWith [as resolveWith] (http://localhost:51940/jquery-3.2.0.min.js:2:28783)
    at A (http://localhost:51940/jquery-3.2.0.min.js:4:14017)
    at XMLHttpRequest. (http://localhost:51940/jquery-3.2.0.min.js:4:16305)`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}