javascript正则表达式---正向预查
什么是正向预查?这里有腾讯招聘的一个例子:
如何给一串数字用千分制表示?比如9999999999变成9,999,999,999。这样一个问题你会怎么答呢?博主js正则学的不咋样,然后用操作字符串的办法做,变成字符串,先除以3,看有几对,然后再加逗号…………(省略无数个步骤)
直到有一天我看到了这样一个回答:
var f = '99999999999'.replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,');
console.log(f);
一行代码搞定了。我当时是惊呆的0.0,但是不知道这是啥意思阿。就重新学了一遍正则,发现里面有个叫正向预查的东西,很神奇,就一起来看看这是什么鬼。
(?=)这个东西就是正向预查。
先给一个简单的例子:
var con="coming soon,going gogogo"
var reg = /\b[\w]+(?=ing\b)/g;//匹配带ing的单词,但是不要ing。注意:如果ing后不加\b,类似于goingabc也会匹配。
console.log(con.match(reg));
这里匹配到["com", "go"]。先匹配单词边界\b,然后+匹配前面多次或者一次,然后到这个正向预查,(?=ing)表示先向后探测,看看有没有ing。如果有,则把前面的匹配出来;如果没有,则光标往后移一位,继续探测。这个过程就是正向预查:预先判断为某个值。然后匹配到的东西不包含这个元素,这里也就是ing。官方原话是该匹配不需要获取以供以后使用,是一个非捕获匹配。
相似的还有非捕获性数组: (?: )
var color = "#990000";
/#(?:\d+)/.test(color);
alert(RegExp.$1);//""
这里的正向预查,属于零宽断言,也是正向前瞻。
正向前瞻用来检查接下来的出现的是不是某个特定的字符集。而负向前瞻则是检查接下来的不应该出现的特定字符串集。零宽断言是不会被捕获的。
不过javascript不支持后瞻。
好,回到我们的问题,为了方便观察,我们换做1234567890来匹配
`1234567890`.match(/\d{1,3}(?=(\d{3})+$)/g)
\d首先贪婪匹配123,成功,进入顺序肯定环视,456,789匹配成功,控制权交到$匹配789,匹配失败,回溯
\d匹配12,成功,进入顺序肯定环视,345,678匹配成功,控制权交到$匹配678,匹配失败,回溯
\d匹配1,成功,进入顺序肯定环视,234,567,890,控制权交到$匹配890,匹配成功.
\d贪婪匹配234,成功,进入顺序肯定环视,567,890匹配成功,控制权交到$匹配890,匹配成功
\d贪婪匹配567,成功,进入顺序肯定环视,890匹配成功,控制权交到$匹配890,匹配成功
\d贪婪匹配890,成功,进入顺序肯定环视,匹配空字符串匹配失败,匹配失败。
\d匹配89,\d匹配8在顺序肯定环视里都会失败,于是返回。
文档匹配1,234,567
还有一些资料:
javascript正则表达式---正向预查的更多相关文章
- PHP正则 正向预查&反向预查
了解正向预查&反向预查前,我们先要知道正则的2个函数:preg_match_all . preg_replace preg_match_all 可以看文章:点击查看 preg_replace ...
- JavaScript正则表达式详解(一)正则表达式入门
JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...
- javaScript正则表达式的使用
今天看了一个正则的写法,回想一下,对于正则都忘记得差不多了,称这个时间整理一下,收集了一些以前的资料和查看了一些别人的资料,做一个小小的总结,方便自己以后查看,也希望能帮助到大家!! 欢迎指正,欢 ...
- js正则表达式中的正向肯定预查和正向否定预查
对于没有使用过这几个表达式的人,应该对这个概念都有点不太理解,下面就以实际例子说明这几个表达式的用户. 一.?:pattern——匹配检验:会作为匹配校验,是一个非获取匹配,并出现在匹配字符结果里面, ...
- 正则表达式中的?=,?!,?<=,?<!(预查)解释小栗子
之前在学正则表达式的时候学的并不是很透彻 感觉看看元字符(元字符要用 \ 转义),限定符(^开头 $结尾), 前面写个范围[a-z],在后面写个{n,}能匹配就行了 当时的自己 然而昨天我参加了个 ...
- python re:正向肯定预查(?=)和反向肯定预查(?<=)
参考资料:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html (?=pattern) 正向肯定预查,在任何匹配pattern的字符串 ...
- JavaScript正则表达式(深度)(Day_14)
忘不掉的是回忆,继续的是生活,错过的,就当是路过. 简介 正则表达式是用于匹配字符串中字符组合的模式.在 JavaScript中,正则表达式也是对象. 这些模式被用于 RegExp 的 exec 和 ...
- DOM笔记(十):JavaScript正则表达式
一.RegExp ECMAScript通过RegExp类型类支持正则表达式,语法和Perl类似: var exp = /pattern/flags; patternb部分是任何简单的或复杂的正则表达式 ...
- javascript正则表达式中 (?=exp)、(?<=exp)、(?!exp)
(?=exp) 百度百科给的解释:非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用.例如,“Windows(?=95|98|NT|2000) ...
随机推荐
- Python基础知识2-内置数据结构(上)
分类 数值型 用浮点型的时候注意别和"=="一起使用. 数字的处理函数 注意round()函数的特殊:四舍六入五取偶 类型判断 列表list 列表list定义 初始化 列表索引访 ...
- Python--文件、文件夹、压缩包、处理模块shutil
高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 1 import shutil 2 3 shuti ...
- DAY02、正式介绍python
一.编程语言介绍(***) 1.1.机器语言:直接用计算机能理解的二进制指令编写程序,直接控制硬件 1.2.汇编语言:用英文标签取代二进制指令编写程序,本质也是直接控制硬件 1.3.高级语言:用人类能 ...
- 莫烦scikit-learn学习自修第四天【内置训练数据集】
1. 代码实战 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ from sklearn import datasets from sklearn.linea ...
- sql 保留2位小数/换行
2.176544保留两位小数 1.select Convert(decimal(18,2),2.176544) 结果:2.18 2.select Round(2.176544,2) 结果:2.180 ...
- 所活天数!java Date应用
package cn.jiu.com; import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...
- 一、使用Navicat连接阿里云服务器宝塔面板里创建的数据库
一.数据库配置连接 (通过新增用户的方式)
- Jenkins+PowerShell持续集成环境搭建(五)SSRS项目
部署SSRS项目的原理是使用ReportingService2005类的方法实现rdl文件上传等功能. 上传rdl文件的脚本示例: $username="Victor"; $pas ...
- iOS一些高效代码
一. [Bugly startWithAppId:BUGLY_APP_ID #if DEBUG developmentDevice:YES #endif config:config]; 二.
- hdu-1238(kmp+枚举)
题意:给你n个字符串,问你这里面最长的公共子串的长度是多少,一个公共子串的反串也算,比如样例二: 解题思路:随便找一个字符,枚举它的子串然后跑kmp就行了,很多人的博客都是用string类里面的函数来 ...