主体概要

正则表达式是什么

是匹配模式。要么匹配字符、要么匹配位置

内容

掌握字符类量词就能解决大部分常见正则问题

关键内容:字符组、量词、贪婪、惰性、模糊、横向、纵向、分支、位置

重要的基础

   如何匹配字符,就靠量词和字符类

量词

量词即重复,找/匹配 重复字符,标志 {}

贪婪:在范围内,匹配越多越好( greedy quantifiers)

1 var regex = /\d{2,5}/g;
2 var string = "123 1234 12345 123456";
3 console.log( string.match(regex) );
4 // => ["123", "1234", "12345", "12345"]
5 //其中正则 /\d{2,5}/,表示数字连续出现 2 到 5 次。会匹配 2 位、3 位、4 位、5 位连续数字。

View Code

有贪婪就会有懒惰

惰性:​​匹配到就行,尽力少匹配​ (lazy quantifiers),标志在后面加?

1 var regex = /\d{2,5}?/g;
2 var string = "123 1234 12345 123456";
3 console.log( string.match(regex) );
4 // => ["12", "12", "34", "12", "34", "12", "34", "56"]
5 //其中 /\d{2,5}?/ 表示,虽然 2 到 5 次都行,当 2 个就够的时候,就不再往下尝试了。

View Code

? 有吗

+ 至少

* 任意​​

 字符类

在范围内找\匹配,标志【】,可以是一组,也可以是其中一个字符 ,

字符类,也称字符组

反字符类:字符类的第一位放 ^(脱字符),表示求反的概念。

例如 [^abc],表示是一个除 "a"、"b"、"c"之外的任意一个字符

当字符组里有特别多字符,比如 [123456abcdefGHIJKLM],可以写成 [1-6a-fG-M]。用连字符 - 来省略和简写。​

过人之处:模糊匹配

正则只有精确匹配,就没什么可深入的东西。但模糊匹配才是让正则强大的原因。

模糊匹配分为横向匹配和纵向匹配。

横向匹配指的是,一个正则可匹配的字符串的长度不是固定的,可以是多种情况的。​

基本和量词配合使用,要匹配字符,可以重复多少

譬如 {m,n},表示连续出现最少 m 次,最多 n 次。​

1 //模糊匹配之--横向匹配
2     var regex =/ab{2,5}c/g;
3     var string="abc abbc abbbc abbbbc abbbbbc abbbbbbc";
4     console.log(string.match(regex));
5     //=> ["abbc","abbbc","abbbbc","abbbbbc"]

横向匹配

纵向匹配指的是,一个正则匹配的字符串,具体到某一位字符时,它可以不是某个确定的字符,可以有多种可能。

通常用字符类​配合使用,在一组里找想要字符

其实现的方式是使用字符类。譬如 [abc],表示该字符是可以字符 "a"、"b"、"c" 中的任何一个。​​

1 //模糊匹配之--纵向匹配
2     var regex=/a[123]b/g;
3     var string="a0b a1b a2b a3b a4b";
4     console.log(string.match(regex)); //=> ["a1b","a2b","a3b"]

纵向匹配

选择分支

用 |(管道符)分隔,表示其中任何之一。

1        var regex =/good|nice/g;
2     var string="good idea,nice try.";
3     console.log(string.match(regex)); //=>["good","nice"]  匹配字符串 "good" 和 "nice"

View Code

注意:默认从左到右匹配,左边能匹配,就会忽略右边​

比如我用 /good|goodbye/,去匹配 "goodbye" 字符串时,结果是 "good":

1 var regex = /goodbye|good/g;
2 var string = "goodbye";
3 console.log( string.match(regex) );  // => ["goodbye"]

View Code

优先级

  优先级 由高到低

转义       \

括号     (?!) () [] (?:)​​​

量词    {m} {m,n}​

位置     ^ $​

分隔    |​

匹配位置

1、位置(锚)是相邻字符之间的位置 。对于位置的理解,我们可以理解成空字符 ""。 字符之间的位置,可以写成多个​​

比如,下图中箭头所指的地方:

1  //比如 "hello" 字符串等价于如下的形式:
2 "hello" == "" + "h" + "" + "e" + "" + "l" + "" + "l" + "" + "o" + "";
3 //也等价于:
4 "hello" == "" + "" + "hello"
5 //把 /^hello$/ 写成 /^^hello$$$/,是没有任何问题的:
6 var result = /^^hello$$$/.test("hello");
7 console.log(result);     // => true

View Code

2、 断言

先行断言:(?=) 表示 匹配 前面的位置

1  //比如 (?=l),表示 "l" 字符前面的位置,例如:
2 var result = "hello".replace(/(?=l)/g, '#');
3 console.log(result);// => "he#l#lo"

View Code

 后行断言:(?<=)  表示 匹配 后面的位置

  如:只匹配美元符号之后数字:/(?<=\$)\d+/

 否定-先行断言:(?!) 表示 匹配不在 前面位置就行, 与 (?=) 的互补​

1 var result = "hello".replace(/(?!l)/g, '#');
2 console.log(result);   // => "#h#ell#o#"

View Code

3、关于位置

  ^(脱字符)匹配开头,在多行匹配中匹配行开头。

$(美元符号)匹配结尾,在多行匹配中匹配行结尾。

    ^和$ 一起用,匹配整体​

  \b 是单词边界,具体就是 \w 与 \W 之间的位置,也包括 \w 与 ^ 之间的位置,和 \w 与 $ 之间的位置。

1 //比如考察文件名 "[JS] Lesson_01.mp4" 中的 \b,如下:
2 var result = "[JS] Lesson_01.mp4".replace(/\b/g, '#');
3 console.log(result);   // => "[#JS#] #Lesson_01#.#mp4#"

View Code

   \B 非单词边界

1 //比如上面的例子,把所有 \B 替换成 "#":
2 var result = "[JS] Lesson_01.mp4".replace(/\B/g, '#');
3 console.log(result);
4 // => "#[J#S]# L#e#s#s#o#n#_#0#1.m#p#4"

View Code

正则表达式,太多字符、元字符要记,且好乱。本篇是笔记、是我个人的理解、围绕如何”懂“正则表达式,且本篇大多数是源于《javascript正则表达式迷你书》的内容,这书比较深入理解正则表达式及正则内部匹配准则(原理)。

下一篇:快速解决正则续---属性、方法、综合应用    会更多地展示这书的精华。

转载于:https://www.cnblogs.com/TAO-JL/p/9589309.html

快速解决正则----模糊匹配、字符类、量词相关推荐

  1. 前端模糊匹配方式,前端正则模糊匹配

    前端的匹配方式有很多这里简单提供模糊匹配方式:使用 RegExp 函数 正则表达式来进行匹配 正则表达式 var list = ['nai','43q','5xn'] var keyWord = 'n ...

  2. C++正则匹配中文乱码_中文正则表达式匹配-正则中文匹配

    使用std::wregex #include <QtCore/QCoreApplication> #include <iostream> #include <string ...

  3. java中a z正则表达式,Java正则字符类[a-zA-Z]匹配

    字符类[a-zA-Z]匹配从a到z或A到Z的任何字符. 示例 以下示例显示了字符类匹配的用法. package com.yiibai; import java.util.regex.Matcher; ...

  4. java中 a-zA-z_Java正则字符类[a-zA-Z]匹配

    字符类[a-zA-Z]匹配从a到z或A到Z的任何字符. 示例 以下示例显示了字符类匹配的用法. package com.yiibai; import java.util.regex.Matcher; ...

  5. java 正则 u2E80_java正则表达式中的POSIX 字符类和Unicode 块和类别的类介绍

    假如现在有一个需求,要你用java语言来匹配出一个文本里面的所有(英文半角)标点符号,你会怎么写呢?我想大多数人应该是把这些符号都罗列出来, 如: !"#$%&'()*+,-./:; ...

  6. boost正则库匹配ASII编码的中文、全角字符示例

    首先,boost正则库(regex)不支持形如 [0-9] 这样的表达式,貌似会崩溃. 现在查网上正则匹配中文的例子,都是讲用 \uFF00-\uFFFF ; 拜托,\u是unicode编码,能用于我 ...

  7. ES第十三天-扩展查询-前缀匹配、通配符查询、正则查询、模糊匹配、句子前缀匹配

    前言 ES的无论什么搜索,对于text类型字段其实都是基于倒排索引去进行搜索的,也就是进行分词后的,因此如果想像传统数据库一样的模糊匹配,一般可以使用它的keyword进行搜索.(keyword不会被 ...

  8. php正则匹配字符_php中字符串和正则表达式详解

    一.字符串类型的特点 1.PHP是弱类型语言,其他数据类型一般都可以直接应用于字符串函数操作. echo substr("123456",2,4);  //输出345 echo s ...

  9. python正则表达式开头和结尾_Python 基础之正则之一 单字符,多字符匹配及开头结尾匹配...

    一.正则表达式之单个字符匹配 格式:lst = re.findall(正则表达式,要匹配的字符串) 预定义字符集 匹配内容 .匹配任意字符,除了换行符\n \d匹配数字 \D匹配非数字 \w匹配字母或 ...

最新文章

  1. select sum也会返回null值
  2. HTTP请求分析工具Fiddler
  3. linux中级-JAVA企业级应用TOMCAT实战
  4. My Opportunity应用点击Edit后出现time out的错误分析
  5. 干货| LeNet-5模型详解(附Python详细代码及注释)
  6. Android 系统(112)---Android系统读取 CPU温度(MTK平台)
  7. Word中MathType公式与LaTeX公式的转换
  8. PKM2数据导出的xml显示用的XSL
  9. Camel可视化操作(结合Gooflow)
  10. 使用代码控制小米智能插座
  11. 《剑指 offer : 专项突破版》 读后感
  12. 华为认证云服务工程师(HCIA-Cloud Service)-- 练习题2
  13. (6)EndNote——文献管理软件通用操作大全
  14. 基于Verilog的TCAM硬件实现
  15. vi/vim滚动屏幕
  16. BULK INSERT如何将大量数据高效地导入SQL Server
  17. 濡沫江湖一直显示获取服务器列表失败,濡沫江湖存档如何获取?游戏存档获取方法图文分享...
  18. torch.multinomial使用
  19. 第六讲 典型相关性分析
  20. 关于TCP协议的端口(port)

热门文章

  1. java 修饰符作用_Java关键字修饰符的作用范围
  2. el表达式中换行_angularjs/ng-bind如何保留换行符
  3. python简单算法题_python几道简单的算法题
  4. 计算机风冷散热系统的原理,显卡“发烧”的原因_显卡散热原理
  5. axure文件如何加密_rp文件命名也可能导致文件无法打开
  6. ue4相机_纳格数字创意课程介绍 |UE4虚拟现实技术室内方向
  7. 最大间隔分类器的错误理解
  8. 逆向建模软件介绍_逆向技术在2代机修理中的应用
  9. 深度学习每层的通道数如何计算_深度学习基础系列(一)| 一文看懂用kersa构建模型的各层含义(掌握输出尺寸和可训练参数数量的计算方法)...
  10. godaddy 管理mysql_在godaddy上使用MySQL和Entity Framework的安全例...