在JS .replace()中使用RegExp来提取文件&来自字符串的行信息?

时间:2015-10-01 11:07:09

标签: javascript regex replace console.log

我正在使用自己的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);

RegExr example in action global & non-global

该表达式分为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找到演示。

1 个答案:

答案 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从冒号到新行获取任何内容