前言

大家学生时代在数学卷子上的填空题,可能会遇到这样的找规律题目,比如最简单的等差数列:

已知数列:1,5,9,13,17…,求该数列的表达式是 ___________ 答案是显而易见的:4*n-3 (n为整数)

我刚接触正则表达式的时候,很自然地想到了这里。

我们构建的正则表达式,比如 /c{2,5}ode/ 很类似于数列的表达式,要去匹配的字符串比如 "code""ccode""cccode" 很类似于数列中的数字。

所以正则表达式是对目标字符串们的共性,抽象出来的表达!

正则表达式的身影出现在各种开发语言中…这里,我们走入 JavaScript 的正则世界。在开始之前,我给大家分享两个正则的在线工具:

  • 可视化正则,且支持可视化效果图片导

Regulex:JavaScript Regular Expression Visualizer​jex.im

  • 支持保存与分享正则、输入字符串看匹配情况,还有打怪测试

PHP, PCRE, Python, Golang and JavaScript​regex101.com

Let’s Go!!!

正则匹配的内容

正则匹配的内容有两部分,一个是字符,一个是位置。

字符很好理解,比如 "code"中的co;位置呢,指的是相邻字符之间的空隙,比如co之间、od之间,另外还有特殊的像开始与结束:^$,只有一个边是字符。

这里画了一张匹配字符和位置的小结:

Demo

匹配字符demo:

  • 匹配颜色16进制:这里有横向匹配,使用了量词 {6}{3};有纵向匹配,使用了字符组 [0-9A-Fa-f];有多选分支,使用了管道符|
  • 匹配html中的id值-方法1:比如 '<div id="container" class="main"></div>' 要找出 id="container"。 这里在量词后加?是开启了惰性匹配,惰性匹配是尽可能吃得少,而默认的贪婪匹配是尽可能吃得多,试试链接中去掉问号的结果
  • 匹配html中的id值-方法2:(条条大路通罗马)这里用排除字符组明确排除双引号之间不能再有双引号

匹配位置demo:

需求:数字的千位分隔符表示,比如输入"12345678",转为12,345,678。我们会用到str#replace

var result = "123456789".replace(/.../)/g, ',')
console.log(result);

正则们:

  • 数字的千位分割符表示-方法1:这里用了结束位置符$,从数字末尾开始;用了Positive lookahead (?=(d{3})),找到每3位数字后面的位置;用了Negative lookahead (?!^),排除,123,456,789这样的情况;
  • 数字的千位分割符表示-2:这里用Postive lookbehind (?<=d) 代替了上一个例子中的(?!^),这里有一个细节是当多个位置放在一起时,看作对这个位置的多个限制条件。
  • 数字的千位分割符表示-3:这里用了单词和非单词边界,可以匹配多个数字。

工具:括号

括号除了提高优先级以外,还有一个重要的功能:分组。以便我们能引用它:

  • 在JavaScript中引用
  • 在正则表达式里引用

简单demo:在JavaScript中引用

注意这里的(?:p)是非捕获分组,这样的分组不能被捕获,也不能被引用

//模拟trim方法:在JavaScript中引用分组
function trim(str) {return str.replace(/^s*(.*?)s*$/g, "$1");
}
console.log( trim("  foobar   ") );//将单词首字母大写:在JavaScript中引用分组
function titleize(str) {return str.toLowerCase().replace(/(?:^|s)w/g, function(c) {return c.toUpperCase();});
}
// console.log( titleize('My name is harden') );

简单demo:在正则表达式里引用

保证分割符前后一致

var regex = /d{4}(-|/|.)d{2}1d{2}/;
var string1 = "2017-06-12";
var string2 = "2017/06/12";
var string3 = "2017.06.12";
var string4 = "2016-06/12";
console.log( regex.test(string1) ); // true
console.log( regex.test(string2) ); // true
console.log( regex.test(string3) ); // true
console.log( regex.test(string4) ); // false

JavaScript API使用注意事项

一共有6个API:

  • str#search:返回首次匹配的位置,未找到返回 -1
  • str#split
  • str#match:有 g ,返回的是所有匹配的内容;没有 g ,返回,首个匹配结果 + 捕获组数据(没有,返回 null )+ 匹配结果开始位置 + 搜索的字符串;没有匹配返回 null
  • str#replace
  • regex#test:有匹配返回 true ,没有匹配返回 false
  • regex#exec:返回 当前匹配结果 + 捕获组数据(没有,返回 null )+ 匹配结果开始位置 + 搜索的字符串

和正则有关的操作(罗列推荐使用的方法):

  • 验证:regex#test
  • 切分:str#split
  • 提取(提取括号中内容):str#matchregex#exec 差不多,另外str#replace在参数函数中获取数据也方便;
  • 替换:str#replace

注意事项:

  • str#searchstr#match 都支持字符串和正则作参数,在字符串作参数时会自动字符串转正则。遇到元字符要转义:
var string = "2017.06.27";console.log( string.search(".") );
// => 0
//需要修改成下列形式之一
console.log( string.search(".") );
console.log( string.search(/./) );
// => 4
// => 4

  • regex#execstr#match 比较:在没有修饰符g时,使用 str#match 可以获取完整信息,如果有修饰符g时,也想获得完整信息,用一下 regex#exec
var string = "2017.06.27";
var regex2 = /b(d+)b/g;
var result;
while ( result = regex2.exec(string) ) {console.log( result, regex2.lastIndex );
}
// => ["2017", "2017", index: 0, input: "2017.06.27"] 4
// => ["06", "06", index: 5, input: "2017.06.27"] 7
// => ["27", "27", index: 8, input: "2017.06.27"] 10

结尾

我猜这里的demo们的信息量有一点点爆炸 ,凝聚就是精华!

基础篇包含了: - 匹配内容:匹配字符或者位置(量词、字符组、贪婪&惰性匹配、排除字符组 balabalaba) - 括号 -> 引用 - JavaScrip的正则API们

最后扔两个非常有意思的函数,和这群API中某两个相关:

字符串压缩:str#replace

//str#replace做压缩
function compress(source) {var keys = {};source.replace(/([^=&]+)=([^&]*)/g, function(full, key, value) {keys[key] = (keys[key] ? keys[key] + ',' : '') + value;});var result = [];for (var key in keys) {result.push(key + '=' + keys[key]);}return result.join('&');
}console.log( compress("a=1&b=2&a=3&b=4") );
// => "a=1,3&b=2,4"

类型判断:字符串做信息存储,str#split

//类型判断:使用字符串存储信息
var utils = {};
"Boolean|Number|String|Function|Array|Date|RegExp|Object|Error".split("|").forEach(function(item) {utils["is" + item] = function(obj) {return {}.toString.call(obj) == "[object " + item + "]";};
});
console.log( utils.isArray([1, 2, 3]) );
// => true

参考链接

老姚-JS正则表达式完整教程:感谢老姚

入门教程

php 两个单词 正则表达式字符前_【阅读整理】正则表达式 - 基础篇相关推荐

  1. 正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang

    正则表达式学习日记_<学习正则表达式>笔记_Mr_Ouyang 所属分类: 正则表达式学习日记  书名:     学习正则表达式 作者:     Michael Fitzgerald 译者 ...

  2. python包括哪些部分_第一部分 Python基础篇

    第⼀一部分 Python基础篇 1. 为什什么学习Python? 朋友推荐,比较简单易学,生态圈比较强大 发展趋势:人工智能.数据分析 2. 通过什什么途径学习的Python? 廖雪峰.网络博客.相关 ...

  3. 谷粒商城三阶段课件_谷粒商城分布式基础篇一

    微服务架构图 微服务划分图 搭建虚拟开发环境 1.下载安装VirtualBox 下载安装Vagrant 2.安装好后,创建一个存放vagrant box的目录,方便日后统一管理,比如叫做../cent ...

  4. php 两个单词 正则表达式字符前_PHP正则表达式核心技术完全详解 第3节

    PHP 正则表达式核心技术详解 第3节 我们在第2节中学习了有关正则的原子.元字符.原子表.转义字符等重要知识点, 这一节我们来讲一下正则中的量词.断言匹配.逻辑匹配.等重要知识! 1 量词 量词: ...

  5. 正则表达式 右上角加号_最全正则表达式讲解实战,附源码,敲一遍学会

    文章来源:王的机器 作者:王圣元 本文含 10026 字,27图表截屏建议阅读 42 分钟在公众号对话框回复 RE获取完整 Jupyter Notebook0引言 正则表达式(Regular Expr ...

  6. python正则表达式需要模块_使用Python正则表达式模块,让操作更加简单

    处理文本数据的一个主要任务就是创建许多以文本为基础的特性. 人们可能想要在文本中找出特定格式的内容,比如找出存在于文本中的电子邮件,或者大型文本中的电话号码. 虽然想要实现上述功能听起来很繁琐,但是如 ...

  7. js正则表达式语法大全_一条正则表达式闹的乌龙

    "实战Elisp"系列旨在讲述我使用Elisp定制Emacs的经验,抛砖引玉,还请广大Emacs同好不吝赐教--如果真的有广大Emacs用户的话,哈哈哈. 序言 我要编写一个Eli ...

  8. java正则表达式过滤特殊字符_使用Java正则表达式过滤特殊字符

    在某航空集团,系统参数必须过滤一下字符,于是正则表达式处理拦路了! 需求: 系统输入框(所有输入框),所有URL,过滤以下关键字和特殊字符(下述字符,有哪些影响到业务系统使用的,请具体列出,并说明原因 ...

  9. python正则表达式模糊匹配_用python正则表达式编译模糊正则表达式

    当我发现python regex模块可以进行模糊匹配时,我感到非常高兴,因为它似乎是解决我许多问题的简单方法. 但是现在我遇到了一个问题,我没有从文档中找到任何答案. 如何使用新的模糊性值功能将字符串 ...

最新文章

  1. Hands-On Unity 2018 x 移动游戏开发教程
  2. react 实现数据双向绑定
  3. https 页面中引入 http 资源的解决方式
  4. MySQL avg()函数
  5. IDEA中Alt + Insert快捷键定制生成类方法
  6. opencv SIFT角检测
  7. Android 文件存放路径
  8. 脚本的使用与修改Tampermonkey(油猴)
  9. APP测试点(思维导图)
  10. Windows下把文件夹压缩成.tar.gz格式
  11. select标签 selected 选中状态动态查询
  12. IMO MSC 307(88)附件1第2部分烟毒性试验
  13. 版本管理工具Git使用总结
  14. 盘点40余款好用的项目管理软件
  15. Android开发 assets目录
  16. QListWidget使用,文件列表
  17. 金蝶 EAS WebService 发布过程
  18. 如何查找Manifest merger failed with multiple errors问题原因
  19. 相机拍摄照度均匀的画面,图像四周存在暗角的原因
  20. 晶振的构造及工作原理

热门文章

  1. Ssm酒店管理系统实战开发
  2. 基于JAVA+SpringMVC+Mybatis+MYSQL的公司管理系统
  3. 基于JAVA+Servlet+JSP+MYSQL的中小型财务管理系统
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的保险销售管理系统
  5. 基于JAVA+SpringBoot+Mybatis+MYSQL的新闻发布系统
  6. 设置行间距_word打印技巧:几个节省纸张的打印设置方法
  7. python之求字典最值
  8. java的二叉树及三种遍历
  9. Linux内核多线程(三)
  10. Fedora 8中完全开启compiz-fusion特效