偏离主题如何使时尚的编辑线?

时间:2014-05-30 08:03:54

标签: javascript regex node.js

我有一个文件,我必须更改一些符合某个规则的行

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库来同步读写。 我做了一些研究,我发现逐行阅读的解决方案非常有趣,但我注意到了一个巨大的减速

1 个答案:

答案 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"最后。