字符串截取中关于正则表达式的应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37064409/article/details/79472574

字符串截取中关于正则表达式的应用

一般前台不处理数据,但是经常会有少量的数据不符合要求,需要简单的截取和拼接。那么正则表达式就是匹配相关字符的有利帮手。

  • 需求
    电路仿真项目
    后台ngspice软件生成波形的纯文本文件.raw文件,通过ajax交互到前台,前台处理string文本,获取到电压节点名称,再获取到该电压xy坐标信息,在前台模拟ngspice的电路波形。(D3.js绘图)

  • 文本数据格式
    这里写图片描述

  • 电压节点 在Variables: 下 v(6),v(3)

  • 节点坐标 在Values:下 有5008个节点 每个组的第一个数据为该点的x坐标,第二个点为电压v(6)的y坐标,第三个点为电压v(3)的y轴坐标…以此类推,由5008个点组成v(6)、v(3)的两条电路波形目标明确,下面取数据,

  • 获取所有数据

因为是纯文本string类型,所以无法转化为json处理,所以只能用String下的API。

  • 获取电压节点
    var str = data.toString();
    var regexp_voltage = /v\(\d{1,}\)/g;
    var voltage_arr = str.match(regexp_voltage); //获取所有电压节点数据
    console.log(voltage_arr); // [ 'v(6)', 'v(3)' ]
  • 获取所有节点坐标数据
    var reg_value = /(-)?\d.\d{4,}e(-|\+)\d{3,}/g;
    var value_arr = str.match(reg_value); //获取所有坐标数据
    console.log(value_arr); //

    [ '0.000000000000000e+000',
      '0.000000000000000e+000',
       ...
      '2.628000000000001e-005',
      ... 14924 more items ]
  • 用到的正则解析

  • /v(\d{1,})/g

    • // 是new regexp()的字面量表示方法,
    • {1,} 表示数字出现最少为一次 ,
    • () 括号在正则中有特殊含义,使用需要转意
    • g 为global 意思为全局匹配
    • i 为忽略大小写
  • match 当一个字符串与一个正则表达式匹配时, match()方法检索匹配项。

    • str.match(regexp);
    • 返回满足匹配的所有文件
  • /(-)?\d.\d{4,}e(-|+)\d{3,}/g

    • (-)? ?非贪婪模式匹配,表示负号可有可不有 ‘+‘表示贪婪模式匹配
    • (-|+) 表示匹配正号或者负号 + 加号需要转意
  • 按照业务需求提取数据
    所有需要的数据经过正则匹配全部获取到了,下面就是讲所有坐标的数组,按照xy坐标分离

    // 生成坐标数据
    function bulidData(value_arr, voltage) {
        this.voltage = voltage; //电压节点数
        this.xynum = value_arr.length / (voltage + 1); //总坐标数  5008
        this.line_arr = [];
        for (var i = 0; i < this.xynum; i++) {
            this.line_arr[i] = [];
            for (var j = 0; j < this.voltage; j++) {
                this.line_arr[i][j] = [parseFloat(value_arr[(this.voltage + 1) * i]), parseFloat(value_arr[(this.voltage + 1) * i + j + 1])];
            }
        }
    }

    var getData = new bulidData(value_arr, voltage_arr.length);
    console.log(getData.line_arr);  //

    //[ [ 0, 0 ], [ 0, 0 ] ],
  [ [ 1e-8, 4.059541909295916e-7 ],
    [ 1e-8, -0.00001254808081085912 ] ],
  [ [ 2e-8, 9.047288045405111e-7 ],
    [ 2e-8, -0.00003327544193609811 ] ],
  [ [ 4e-8, 0.000002002174545490121 ],
    [ 4e-8, -0.00008459111638536854 ] ]
    ...

即 所有的line_arr[i][0]都是v(6)的波形坐标数据,所有的line_arr[i][1]都是v(3)的波形坐标数据。明天通过D3.js讲坐标连成线就是电路波形了。

所有代码如下:

//数据解析
const fs = require("fs");
fs.readFile('test.raw', function (err, data) {
    if (err) {
        console.log(err);
    }
    var str = data.toString();
    //获取电压节点数组
    var regexp_voltage = /v\(\d{1,}\)/g;
    var voltage_arr = str.match(regexp_voltage); //获取所有电压节点数据
    console.log(voltage_arr);

    //获取坐标数据
    var reg_value = /(-)?\d.\d{4,}e(-|\+)\d{3,}/g;
    var value_arr = str.match(reg_value); //获取所有坐标数据
    console.log(value_arr);

    // 生成坐标数据
    function bulidData(value_arr, voltage) {
        this.voltage = voltage; //电压节点数
        this.xynum = value_arr.length / (voltage + 1); //总坐标数   ??? 交互 5008
        this.line_arr = [];
        for (var i = 0; i < this.xynum; i++) {
            this.line_arr[i] = [];
            for (var j = 0; j < this.voltage; j++) {
                this.line_arr[i][j] = [parseFloat(value_arr[(this.voltage + 1) * i]), parseFloat(value_arr[(this.voltage + 1) * i + j + 1])];
            }
        }
    }

    var getData = new bulidData(value_arr, voltage_arr.length);
    console.log(getData.line_arr);

});

引用的.raw文件:

Title: one stage amplifier
Date: Tue Mar 06 13:19:41 2018
Plotname: Transient Analysis
Flags: real
No. Variables: 3
No. Points: 5008
Variables:
0 time time
1 v(6) voltage
2 v(3) voltage
Values:
0 0.000000000000000e+000
0.000000000000000e+000
0.000000000000000e+000

1 1.000000000000000e-008
4.059541909295916e-007
-1.254808081085912e-005

2 2.000000000000000e-008
9.047288045405111e-007
-3.327544193609811e-005

3 4.000000000000000e-008
2.002174545490121e-006
-8.459111638536854e-005

........

猜你喜欢

转载自blog.csdn.net/weixin_37064409/article/details/79472574