有用的正则表达式

Posted by Turingdo Studio on June 5, 2018

数字


千位符

<InputNumber
      defaultValue={1000}
      formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
      parser={value => value.replace(/\$\s?|(,*)/g, '')}
      onChange={onChange}
/>
<InputNumber
  defaultValue={100}
  min={0}
  max={100}
  formatter={value => `${value}%`}
  parser={value => value.replace('%', '')}
  onChange={onChange}
/>

保留两位小数1

function returnFloat(value) {
    var value = Math.round(parseFloat(value) * 100) / 100;
    var xsd = value.toString().split(".");
    if (xsd.length == 1) {
        value = value.toString() + ".00";
        return value;
    }
    if (xsd.length > 1) {
        if (xsd[1].length < 2) {
            value = value.toString() + "0";
        }
        return value;
    }
}
var num = 3.1;
console.log(returnFloat(num));

保留两位小数2

/**
 * 格式化input输入的数字
 * @param v 输入的值
 * @param fix 保留的几位小数点,0代表只能输入整数
 * @param max 最大的输入的数字
 * @returns  返回格式后的结果
 */
function parseNumber(v = 0, fix = 0, max = 999999) {
    v = `$ {
        v
    }`;
    if (!v) return 0;
    if (fix === 0) {
        v = v.replace(/[^\d|\.]/g, '');
    } else {
        v = v.replace(/[^\d|\.]/g, '');
        const valueArr = v.split('.');
        if (valueArr.length > 1) {
            //处理当输入 .33 的情况
            if (valueArr[0] === '') {
                v = v.substring(0, 3);
            } else {
                const reg = new RegExp('^(\\d+)\.(\\d{0,2}).*$');
                v = v.replace(reg, '$1.$2');
            }

        }

    }
    if (v * 1 > max) {
        return v.substring(0, 6)
    }
    return v;
}

完美的保留数字位数

/*
 * @param num {Number} 处理的数字
 * @param w {Number} 保留的位数
 * return {Number|String} 当处理整数的时候返回处理过后的数字,当处理的是小数的时候,返回的是字符串。
 *
 */
function numberFixed(num, w) {
    if (!w) {
        return num;
    }
    const n = parseFloat(num).toFixed(w + 1);

    const nums = n.split('.');

    if (nums.length === 1) {
        return +n;
    }

    if (nums.length > 1) {
        return (nums[0] + '.' + nums[1].substring(0, w));
    }
}

分离[]中的字符串

'[国家]中国[民族]汉[颜色]红色'.replace(/\[(.+?)\]([^\[.]+)/g,function(rs,input1,input2){
  console.log(rs,input1,input2)
})

// 打印----------->
// [国家]中国 国家 中国
// [民族]汉 民族 汉
// [颜色]红色 颜色 红色

分析:分离出[]中的内容,匹配字符串的模式是 []中包含任何内容(.+?) 并且结尾中不包含[或者- [^[-]

注意: .?为非贪婪匹配 .为贪婪匹配

'[国家]中国-[民族]汉-[颜色]红色'.replace(/\[(.+?)\]([^\[\-.]+)/g,function(rs,input1,input2){
  console.log(rs,input1,input2)
})
// 打印----------->
// [国家]中国 国家 中国
// [民族]汉 民族 汉
// [颜色]红色 颜色 红色


正则表达式之?=和?!的用法

Character:x(?=y) Meaning:Matches x only if x is followed by y.

解释:当x后面跟着y(即y的正则匹配成功)的时候,匹配成功

Character:x(?!y) Meaning:Matches a number only if it is not followed by a decimal point.

解释:当x后面跟的不是y(即y的正则匹配成功)的时候,匹配成功

例子

// 定义
let reg1 = new RegExp('Kim(?=Yin)');
let reg2 = new RegExp('Kim(?!Yin)');
// 测试1
reg1.test('Kim'); // false
reg2.test('Kim'); // true
// 测试2
reg1.test('KimY'); // false
reg2.test('KimY'); // true
// 测试3
reg1.test('KimYin'); // true
reg2.test('KimYin'); // false