JS / node.js中匹配字符的行号

是否有可能在Javascript或node.js中find多行input(如文件)的正则expression式匹配字符的行号?

       

网上收集的解决方案 "JS / node.js中匹配字符的行号"

是的,有一个半尴尬的工作。

http://jsfiddle.net/tylermwashburn/rbbqn/

var string = "This\nstring\nhas\nmultiple\nlines.", astring = string.split('\n'), match = /has/, foundon; Array.each(astring, function (line, number) { if (match.exec(line)) foundon = number + 1; }); 

使用parsing器生成器可能是一个好主意。 扎克·卡特(Zach Carter)的jison报告线路号码。 下面是一个使用jisonparsingJSON并用行号报告错误的小工具的例子。 这可能是一个很好的起点。

https://github.com/zaach/jsonlint

对于最小的解决scheme,我可能会尝试使用exec方法( /myregex/.exec(mystring).index )从一个正则expression式获取索引,并将子string( mystring.substring(0, index) )拆分为换行符,并计算数组中元素的数量。

如何通过string索引获取行号

 function lineNumberByIndex(index,string){ // RegExp var line = 0, match, re = /(^)[\S\s]/gm; while (match = re.exec(string)) { if(match.index > index) break; line++; } return line; } 

这很有用

创build一个返回第一个匹配行号的函数

 function lineNumber(needle,haystack){ return lineNumberByIndex(haystack.indexOf(needle),haystack); } 

创build一个返回每个匹配行号的函数

 function lineNumbers(needle,haystack){ if(needle !== ""){ var i = 0,a=[],index=-1; while((index=haystack.indexOf(needle, index+1)) != -1){ a.push(lineNumberByIndex(index,haystack)); } return a; } } 

小提琴