JavaScript正则表达式

本文深入解析JavaScript正则表达式中的先行断言和正向否定查找,通过具体实例解释如何使用这些特性进行精确匹配,同时提供金额格式化的实用代码示例。

JavaScript正则表达式

以下介绍正则解析过程

/(\d)(?=(\d\d\d)+(?!\d))/g.exec(100000000)

这里要注意下x(?=y)先行断言和x(?!y)正向否定查找两个特殊符号的使用(Negative Lookahead)。

  • x(?=y)

匹配'x'仅仅当'x'后面跟着'y'.这种叫做先行断言。 例如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’仅仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。

  • x(?!y)

匹配'x'仅仅当'x'后面不跟着'y',这个叫做正向否定查找。 例如,/\d+(?!\.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。正则表达式/\d+(?!\.)/.exec("3.141")匹配‘141’而不是‘3.141’

需要注意和理解的地方
1.x(?=y) 和 xy 匹配,但是返回的匹配结果是 x
2.Lookahead表达式不会产生匹配结果

简化拆分后,就是()(),即第一个分组是(\d),第二个是(\d\d\d)+,两个分组分别是$1,$2,这里要注意

(\d)

匹配一个数字。 等价于[0-9]。 例如, /\d/ 或者 /[0-9]/ 匹配"B2 is the suite number."中的'2'。

1.所以这里的$1匹配的是一个0-9的数字,$2匹配的是三个数字
2.我们注意到$2是带+号的,表示匹配1次到无限次之间,尽可能多地匹配,根据需要返回

理解js的exec返回值

返回值

如果匹配成功,exec() 方法返回一个数组,并更新正则表达式对象的属性。返回的数组将完全匹配成功的文本作为第一项,将正则括号里匹配成功的作为数组填充到后面。 如果匹配失败,exec() 方法返回 null。

返回参数介绍
result[0] 匹配的全部字符串
result[1], …[n ] 括号中的分组捕获,即以上示例的$1,$2
index 匹配到的字符位于原始字符串的基于0的索引值
input 原始字符串

示例中
result[0]的结果是什么呢,按正则去划分,100 000 000,即$1就是匹配到的全部字符串100,(\d)就是100的最后一个数值0
result[1]就是$1,所以示例中result[0]=result[1],因为$2是Lookahead表达式,所以示例中$1与匹配结果相等
result[2]就是$2,因为是从左到右匹配(向后匹配),所以最后一组就是$2的结果,即000
index是2(原因看上面返回参数介绍)
input忽悠不介绍了

jPublic代码中正则的使用

/**

 * 金额格式化

 * @param {Number}  value   原始金额数值

 * @param {Integer} digit   保留小数位置(默认2位)

 * @returns {string}

 * @alias module:_.fmoney

 * @example

 * _.fmoney(100000000)

 * =>100,000,000.00

 *

 * _.fmoney(100000000.3434343, 3)

 * =>100,000,000.343

 */

_.fmoney = function (value, digit) {

    digit = digit > 0 && digit <= 20 ? digit : 2;

    if (typeof (value) == "undefined" || (!value && value != 0)) {

        return '';

    }

    value = parseFloat((value + "").replace(/[^\d\.-]/g, "")).toFixed(digit) + "";

    var ss = value.split(".");

    var r = ss[1];

    ss[0] = ss[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,")

    return ss[0] + "." + r.substring(0, digit);

};

  • 通过我上面的介绍,是不是很容易理解了这段代码正则的含意啦
  • 喜欢本js函数库的朋友,欢迎给下支持哦

参考资料

JavaScript正则介绍
Lookahead表达式
exec函数介绍
正则在线测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值