我正在使用自己的JavaScript console.log并拥有以下代码,作为在Chrome上运行的测试,:
console.log(new Error().stack.replace(/\n/g, ''));
它产生以下内容:
Error at http://www.mywebsite.com/sites/all/themes/mythemedir/js/page.js:353:15 at b.event.dispatch (http://www.mywebsite.com/sites/all/modules/jquery_update/replace/jquery/1.9/jquery.min.js?v=1.9.1:3:28337) at b.event.add.v.handle (http://www.mywebsite.com/sites/all/modules/jquery_update/replace/jquery/1.9/jquery.min.js?v=1.9.1:3:25042)
我想将/\n/g
更改为获得以下每项结果所需的内容:
var errorPath = "http://www.mywebsite.com/sites/all/themes/mythemedir/js/";
var errorFile = "page.js";
var errorLoc = "353:15";
var errorLineNum = "353";
var errorColNum = "15";
例如,我有:
var errorFull = new Error().stack;
var errorPath = errorFull.replace(/(https?\:\/\/[^ ]*)/i, '');
var errorFile = errorFull.replace(/([^\\]+)\.js$/gi, '');
var errorLoc = errorFull.replace(/\n/g, '');
var errorLineNum = errorFull.replace(/\n/g, '');
var errorColNum = errorFull.replace(/\n/g, '');
有什么想法吗?我已阅读并测试了http://www.w3schools.com/jsref/jsref_obj_regexp.asp& https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp结果各不相同。 var errorFile
似乎崩溃了,我最接近从例子中弄清楚它。仍然没有找到一种方法来获取冒号(:)上任一侧和两侧第一条路径末端的文本。
更新
01。 var errorPath
正在运作,目前正在返回完整匹配。
var errorPath = errorFull.replace(/(https?\:\/\/[^ ]*)/i, '');
返回:"http://www.mywebsite.com/sites/all/themes/mythemedir/js/page.js:353:15"
02。 var errorPath
正在运行,只返回路径:
var errorPath = errorFull.replace(/(https?\:\/\/[^ ]*)(?:\/)/i, '');
返回:"http://www.mywebsite.com/sites/all/themes/mythemedir/js/"
最后通过下面的答案和帮助获得了解!谢谢@winner_joiner& @Tomalak获取所有资源和指导!最终的解决方案如下:
var errorData = /((?:https?\:\/\/[^\s]+)(?:\/))([^:]+).([^\D]+).([^\D]+)/i.exec((new Error()).stack);
var errorPath = errorData[1];
var errorFile = errorData[2];
var errorLoc = errorData[3] + ":" + errorData[4];
var errorLineNum = errorData[3];
var errorColNum = errorData[4];
console.log("errorPath: "+errorPath+", errorFile: "+errorFile+", errorLoc: "+errorLoc+", errorLineNum: "+errorLineNum+", errorColNum: "+errorColNum);
该表达式分为4个捕获组:errorPath
(路径),errorFile
(文件名),errorLineNum
(行号)和errorColNum
(列号) )。整个表达式不是全局运行的,因为错误中引用错误位置的唯一URL是第一个,我们只需匹配第一个集合。所以我们关注的是:
http://www.mywebsite.com/sites/all/themes/mythemedir/js/page.js:353:15
errorPath(errorData[1]
)(路径): ((?:https?\:\/\/[^\s]+)(?:\/))
此部分选择从http://
或https://
到最后/
的所有内容,其结果为:http://www.mywebsite.com/sites/all/themes/mythemedir/js/
。
s?
中的https?
使s
部分可选。
errorFile(errorData[2]
)(文件名): ([^:]+)
此部分选择自路径和下一个(在本例中也是第一个):
以来的所有内容,结果为:page.js
。
errorLineNum(errorData[3]
)(行号): .([^\D]+)
此部分会跳过任何分隔符号(此案例::
)&选择所有内容直到下一个非数字(\D
),结果为:353
。
errorColNum(errorData[4]
)(列号): .([^\D]+)
此部分会跳过任何分隔符号(此案例::
)&再次选择所有内容,直到下一个非数字(\D
),结果为:15
。
可以在RegExr找到演示。
答案 0 :(得分:1)
这可能是一个快速解决方案,您可以使用一个表达式获取整个数据
var errorData = /\s*at\s*(.*\/)([^\/:]+):([^:]+):([^:]+)\n/gi.exec((new Error()).stack);
var errorPath = errorData[1];
var errorFile = errorData[2];
var errorLoc = errorData[3] + ":" + errorData[4];
var errorLineNum = errorData[3];
var errorColNum = errorData[4];
// tested on Win7 with chrome 44+
只是一个提示:如果你在一个正则表达式中使用
g
修饰符,那么在它获得下一个查找的时候会多次调用该函数。您可以在此处找到详细信息Why RegExp with global flag in Javascript give wrong results?
更新1:
\s*at\s*
获得第一行空格和位于和空格
(.*\/)
获取网址,直到最后一个斜杠/
([^\/:]+)
获取文件名
:([^:]+)
得到冒号和任何东西直到下一个冒号
:([^:]+)\n
从冒号到新行获取任何内容