我有一个文件,我必须更改一些符合某个规则的行
N1 N2 N3 r
其中n1 n2和n3是0到1之间的值(带小数)
e.g。
1 0.67 0 r
0.66 5高
0 1 0.989 r
0.96 5慢
0.23 0.345 0.65 r
1 1 1 1 1 1CB
0 0 0.9 r
这些字符串必须替换为字符串值“0 0 0 r” 省略值为“1 1 1 r”的字符串 此
var fs = require('fs');
var async = require('async');
async.waterfall([
function(data,callback){
fs.readFile('test.txt', function (err, data) {
if (err) throw err;
callback(null, data);
});
},
function(data,callback){
var expR =/\b(0\.\d*|[0-1])\s(0\.\d*|[0-1])\s(0\.\d*|0)\sr\b|\b(0\.\d*|[0-1])\s(0\.\d*|[0])\s(0\.\d*|[0-1])\sr\b|\b(0\.\d*|[0])\s(0\.\d*|[0-1])\s(0\.\d*|[0-1])\sr\b/gi;
var dataBn = data.toString().replace(expR, '0 0 0 r');
callback(null, dataBn);
},
function(data,callback){
fs.writeFile('test.ps', data, function(err){
if(err) {
console.log(err);
callback(err,err);
} else {
console.log("The file was saved!");
}
})
}],
function(err, result){
console.log(result);
if(err){/* not handle */}
})
这是我的输出
0 0 0 r
0.66 5高
0 0 0 r
0.96 5慢
0 0 0 r
1 1 1 1 1 1CB
0 0 0 r
它的工作原理也非常快,但我想知道改变这些线路是否有可能更优雅的解决方案......建议?
P.S。我使用async库来同步读写。 我做了一些研究,我发现逐行阅读的解决方案非常有趣,但我注意到了一个巨大的减速
答案 0 :(得分:0)
你可以尝试这种模式:
var res = data.replace(/^(?!1 1 1)(?:(?:0(?:\.[0-9]*)?|1) ){3}r$/gm, '0 0 0 r');
细节:
模式使用锚点^
和$
和m修饰符来确保描述整行。
(?!1 1 1)
是一个负面的先行,可以确保你不属于这种情况1 1 1 r
0(?:\.[0-9]*)?|1
描述了可能的数字(零跟随或不跟随点跟随或不跟数字或1。)
然后我把它放在一个小组中,增加了一个空间并重复了三次并且推出了一个" r"最后。