快速解决正则----模糊匹配、字符类、量词
主体概要
正则表达式是什么
是匹配模式。要么匹配字符、要么匹配位置
内容
掌握字符类和量词就能解决大部分常见正则问题
关键内容:字符组、量词、贪婪、惰性、模糊、横向、纵向、分支、位置
重要的基础
如何匹配字符,就靠量词和字符类
量词
量词即重复,找/匹配 重复字符,标志 {}
贪婪:在范围内,匹配越多越好( 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
快速解决正则----模糊匹配、字符类、量词相关推荐
- 前端模糊匹配方式,前端正则模糊匹配
前端的匹配方式有很多这里简单提供模糊匹配方式:使用 RegExp 函数 正则表达式来进行匹配 正则表达式 var list = ['nai','43q','5xn'] var keyWord = 'n ...
- C++正则匹配中文乱码_中文正则表达式匹配-正则中文匹配
使用std::wregex #include <QtCore/QCoreApplication> #include <iostream> #include <string ...
- java中a z正则表达式,Java正则字符类[a-zA-Z]匹配
字符类[a-zA-Z]匹配从a到z或A到Z的任何字符. 示例 以下示例显示了字符类匹配的用法. package com.yiibai; import java.util.regex.Matcher; ...
- java中 a-zA-z_Java正则字符类[a-zA-Z]匹配
字符类[a-zA-Z]匹配从a到z或A到Z的任何字符. 示例 以下示例显示了字符类匹配的用法. package com.yiibai; import java.util.regex.Matcher; ...
- java 正则 u2E80_java正则表达式中的POSIX 字符类和Unicode 块和类别的类介绍
假如现在有一个需求,要你用java语言来匹配出一个文本里面的所有(英文半角)标点符号,你会怎么写呢?我想大多数人应该是把这些符号都罗列出来, 如: !"#$%&'()*+,-./:; ...
- boost正则库匹配ASII编码的中文、全角字符示例
首先,boost正则库(regex)不支持形如 [0-9] 这样的表达式,貌似会崩溃. 现在查网上正则匹配中文的例子,都是讲用 \uFF00-\uFFFF ; 拜托,\u是unicode编码,能用于我 ...
- ES第十三天-扩展查询-前缀匹配、通配符查询、正则查询、模糊匹配、句子前缀匹配
前言 ES的无论什么搜索,对于text类型字段其实都是基于倒排索引去进行搜索的,也就是进行分词后的,因此如果想像传统数据库一样的模糊匹配,一般可以使用它的keyword进行搜索.(keyword不会被 ...
- php正则匹配字符_php中字符串和正则表达式详解
一.字符串类型的特点 1.PHP是弱类型语言,其他数据类型一般都可以直接应用于字符串函数操作. echo substr("123456",2,4); //输出345 echo s ...
- python正则表达式开头和结尾_Python 基础之正则之一 单字符,多字符匹配及开头结尾匹配...
一.正则表达式之单个字符匹配 格式:lst = re.findall(正则表达式,要匹配的字符串) 预定义字符集 匹配内容 .匹配任意字符,除了换行符\n \d匹配数字 \D匹配非数字 \w匹配字母或 ...
最新文章
- select sum也会返回null值
- HTTP请求分析工具Fiddler
- linux中级-JAVA企业级应用TOMCAT实战
- My Opportunity应用点击Edit后出现time out的错误分析
- 干货| LeNet-5模型详解(附Python详细代码及注释)
- Android 系统(112)---Android系统读取 CPU温度(MTK平台)
- Word中MathType公式与LaTeX公式的转换
- PKM2数据导出的xml显示用的XSL
- Camel可视化操作(结合Gooflow)
- 使用代码控制小米智能插座
- 《剑指 offer : 专项突破版》 读后感
- 华为认证云服务工程师(HCIA-Cloud Service)-- 练习题2
- (6)EndNote——文献管理软件通用操作大全
- 基于Verilog的TCAM硬件实现
- vi/vim滚动屏幕
- BULK INSERT如何将大量数据高效地导入SQL Server
- 濡沫江湖一直显示获取服务器列表失败,濡沫江湖存档如何获取?游戏存档获取方法图文分享...
- torch.multinomial使用
- 第六讲 典型相关性分析
- 关于TCP协议的端口(port)
热门文章
- java 修饰符作用_Java关键字修饰符的作用范围
- el表达式中换行_angularjs/ng-bind如何保留换行符
- python简单算法题_python几道简单的算法题
- 计算机风冷散热系统的原理,显卡“发烧”的原因_显卡散热原理
- axure文件如何加密_rp文件命名也可能导致文件无法打开
- ue4相机_纳格数字创意课程介绍 |UE4虚拟现实技术室内方向
- 最大间隔分类器的错误理解
- 逆向建模软件介绍_逆向技术在2代机修理中的应用
- 深度学习每层的通道数如何计算_深度学习基础系列(一)| 一文看懂用kersa构建模型的各层含义(掌握输出尺寸和可训练参数数量的计算方法)...
- godaddy 管理mysql_在godaddy上使用MySQL和Entity Framework的安全例...