浅尝正则表达式

德瑜
• 阅读 964

之前写正则都是各种上网搜索,还是没有系统的学习过正则表达式的用法,今天稍稍研究了一下下,感觉还是收获颇丰的,分享给各位,希望对于你们有所帮助~~

修饰符

  • g --全局匹配
  • i --不区分大小写,默认区分
  • m --多行搜索

预定义类字符

  • \d: 数字;[0-9]
  • \D: 非数字字符;[^0-9]
  • \s: 空白符;[\t\n\x0B\f\r]
  • \S: 非空白符;[^\t\n\x0B\f\r]
  • \w: 单词字符(字母,数字,下划线);[a-zA-Z_0-9]
  • \W: 非单词字符;[^a-zA-Z_0-9]

字符类

  • []: 表示字符类 []中的^表示取反,-表示范围如:[0-9][a-z];

量词

  • ?: 出现0次或者1次(最多出现一次);
  • +: 出现1次或者多次(最少出现1次);
  • *: 出现0次或者多次(任意次);
  • {n}: 出现n次;
  • {n,m}: 出现n到m次
  • {n,}: 至少出现n次;

常用的边界字符

  • ^: 以xxxx开始;
  • $: 以xxxx结尾;
  • \b: 单词边界;
  • \B: 非单词边界;

贪婪模式

\d{3,6}匹配3-6个数字,那么 "12345678"就会匹配\d{6}

非贪婪模式

在量词后面加上?就会尽可能少的匹配了,上面的例子\d{3,6}? 就会匹配\d{3}

分组

想要匹配abc重复三次的场景,abc{3}不就行了?事实上abc{3}匹配的是c{3},若想匹配abc3次则需要用到分组的概念了;
正则中()表示分组,及(abc){3}为匹配 abc 3次
$n代表匹配的分组
如:2018-03-03匹配换成2018年03月03日?

"2018-03-01".replace(/(\d{4})-(\d{2})-(\d{2})/g,"$1年$2月$3日");

分组中不想被匹配到的分组在分组中加上?:就可以了,如上例:

"2018-03-01".replace(/(\d{4})-(?:\d{2})-(\d{2})/g,"$1年$2月$3日");

这时第二个分组就不会被捕获,就相当于有两个分组,所以不存在$3这时的输出结果就会是 "2018年01月$3日";

aaa | bbb 两个同时匹配

前瞻,后顾

前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言("前"的概念就是正则表达式从文本头部向尾部开始解析)
Javascript 不支持后顾所以这里就不做过多研究了哈。
-符合特定断言为 肯定/正向 匹配
正向前瞻:exp(?=assert)
例子:

"s3&df34a7".replace(/\w(?=\d)/g,'OK');

会输出 "OK3&dOKOK4OK7"即找到匹配的单词(w)后会再次匹配后面的字符是不是数字,如果是则当前匹配的字符替换为OK,本次替换的单词(w)是s,f,3,a

-不符合特定断言为 否定/负向 匹配
负向前瞻:exp(?!assert)
栗子:

"s3&df34a7".replace(/\w(?=\d)/g,'OK');

会输出 "sOK&OKf3OKaOK"即找到匹配的单词(w)后会再次匹配后面的字符是不是数字,如果不是则当前匹配的字符替换为OK,本次替换的单词(w)是3,d,4,7。把7算进来我认为是匹配到7的时候后面没有字符了是空也不是数字所以被替换了,如果不对还请大神指正哈。

对象属性

  • global是否全文搜索,默认为false,修饰符中的g;
  • ignoreCase 是否大小写敏感,默认为false,修饰符中的i;
  • multiline多行搜索,默认为false,修饰符中的m;
  • lastIndex是当前表达式匹配内容的最后一个字符的下一个位置(有点绕哈,后面会解释);
  • source 正则表达式的文本字符串;

举个栗子:

var reg = /\w/gim;
reg.global // true
reg.ignoreCase //true
reg.source // "\w"

方法

方法一

  • RegExp.prototype.test(str) 用于测试字符串参数中是否存在匹配正则表达式模式的字符串,如果存在则返回true,否则返回false

举个栗子:

var reg1 = /\w/;
reg1.test('a'); // true
reg1.test('#'); // false
reg1.test('a'); // true
reg1.test('#'); // false

再举个栗子:

var reg2 = /\w/g;
reg2.test('a'); // true
reg2.test('#'); // false
reg2.test('a'); // false 
reg2.test('a'); // true
reg2.test('a'); // false 

看到区别了么?当全局检索时为什么第二次执行reg2.test('a');时返回false呢?现在就要说说上文提到的对象属性lastIndex啦,没记住的回到上面看看定义,当第一次执行时我们获取到的lastIndex是1,那下一次就会从2的位置开始执行,而我们可以知道2的位置是没有字符的,所以返回false,第三次执行的时候有返回了true是因为查询到没有字符了lastIndex又重置了。同样的你也可以测试reg2.test('aaa')第四次执行的时候就会是false了,需要知道的是,只有在全局检索时(g)lastIndex才会生效,否则的话只会返回 0 哦

方法二

  • RegExp.prototype.exec(str)使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果。如果没有匹配的文本则返回null,否则返回一个数组:

    • index声明匹配文本的第一个字符的位置;
    • input存放被检索字符串的string
非全局调用

调用非全局的RegExp对象的exec()方法时,返回数组

  • 第一个元素是与正则表达式相匹配的文本
  • 第二个元素是与RegExp对象的第一个子表达式(上文中的分组)相匹配的文本(如果有的话)
  • 第二个元素是与RegExp对象的第二个子表达式(上文中的分组)相匹配的文本(如果有的话),以此类推

举个栗子:

var reg = /\d(\w)(\w)\d/;
var text = '1az2bc3cf4df5gf';
var regexec =  reg.exec(text);
console.log(reg.lastIndex + '\t' + regexec.index + '\t' + regexec.toString()); //0    0    1az2,a,z

因为是非全局调用所以reg.lastIndex返回 0;regexec.index 返回了0,匹配到的文本的第一个字符是"1",index也就是0,regexec返回的数组第一元素是与reg相匹配的文本,第二个元素是该文本中的符合正则表达式中第一个分组(w)的文本是"a"后面的z同理。

全局调用

再来看看全局调用的例子

var reg = /\d(\w)(\w)\d/g;
var text = '1az2bc3cf4df5gf';
while(regexec = reg.exec(text)){
    console.log(reg.lastIndex + '\t' + regexec.index + '\t' + regexec.toString()); 
}
// 4    0    1az2,a,z
// 10    6    3cf4,c,f

全局调用 lastIndex 生效 分别读取到1az23cf4的下一个字符的位置,后面与非全局调用同理,不过全局调用返回的是整段字符串符合规则的文本。

嗯哼,这篇文章就到这里了,如果对你有所帮助点个赞啦猫大在此谢过啦
本文会在个人博客更新的哦,博主可好了,有空溜达溜达~~~

点赞
收藏
评论区
推荐文章
墨冰 墨冰
4年前
学习无止境,我总结了一份“正则表达式”大全供你使用
学习不打烊,充电加油只为遇到更好的自己。希望大家如果觉得好的话可以点赞,评论鼓励一下。最近博主学习了正则表达式,感觉这个正则表达式的学习也非常必要,然后我就花了一点时间帮大家总结了常用的正则表达式供大家学习使用。如果有需要一定要收藏起来呀,方便之后在进行相应字符匹配的时候使用。正则表达式测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串
待兔 待兔
11个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Karen110 Karen110
3年前
再见,正则表达式
从一段指定的字符串中,取得期望的数据,正常人都会想到正则表达式吧?写过正则表达式的人都知道,正则表达式入门不难,写起来也容易。但是正则表达式几乎没有可读性可言,维护起来,真的会让人抓狂,别以为这段正则是你写的就可以驾驭它,过个一个月你可能就不认识它了。完全可以说,天下苦正则久矣。今天给你介绍一个好东西,可以让你摆脱正则的噩梦,那就是Python中一个
Stella981 Stella981
3年前
JavaScript 正则表达式上——基本语法
定义JavaScript种正则表达式有两种定义方式,定义一个匹配类似<%XXX%的字符串1\.构造函数varregnewRegExp('<%\^%\%','g');2\.字面量varreg/<%\^%\%/g;g:global,全文搜索,默认搜索到第一个结果接停止
Wesley13 Wesley13
3年前
mysql在LINUX和WINDOWS系统下设置表名不区分大小写
1.在LINUX系统下,表的名称是区分大小写的,而在WINDOWS环境下,表名不区分大小写;2.设置表名不区分大小写:WINDOWS环境下,修改mysql安装目录下的my.ini配置文件,在【mysqld】下添加lower\_case\_table\_names的参数,将参数值设置为0区分大小写,设置为1不区分大小写
Stella981 Stella981
3年前
Python正则表达式用法详解
搞懂Python正则表达式用法Python正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式。re模块使Python语言拥有全部的正则表达式功能。compile函
Stella981 Stella981
3年前
Nginx配置中Location的优先级
根据Nginx的官方文档,Location标签一共有四个修饰符,分别是:(1):表示完全匹配;(2)^~:匹配URI的前缀,并且后面的正则表达式不再匹配,如果一个URI同时满足两个规则的话,匹配最长的规则;(3)~:匹配正则表达式,大小写敏感;(4)~:匹配正则表达式,大小写不敏感;优先级:(1
Stella981 Stella981
3年前
Python中re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识。关于正则表达式的语法,不作过多解释,网上有许多学习的资料。这里主要介绍Python中常用的正则表达式处理函数。re.matchre.match尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词。!复制代码(http://static.oschina.net
Stella981 Stella981
3年前
AJPFX总结关于Java中过滤出字母、数字和中文的正则表达式
1、Java中过滤出字母、数字和中文的正则表达式(1)过滤出字母的正则表达式\^(AZaz)\(2)过滤出数字的正则表达式\^(09)\(3)过滤出中文的正则表达式\^(\\\\u4e00\\\\u9fa5)\(4)过滤出字母、数字和中文的正则表达式\^(azAZ09\\\\u
Stella981 Stella981
3年前
JavaScript基础入门10
JavaScript基础入门10\toc\正则表达式正则表达式(regularexpression)是一个描述字符模式的对象。在JavaScript中,RegExp表示正则对象。在开发的工作当中,我们经常需要使用正则表达式强大的模式匹配、文本检索、以及替换功能。简单的说,
Python进阶者 Python进阶者
2年前
盘点一个Python正则表达式的问题
大家好,我是皮皮。一、前言前几天在Python白银群【whoisme】问了一个Python正则表达式的问题,这里拿出来给大家分享下。下图是他的正则表达式:二、实现过程这个正则表达式还是蛮复杂的,在Python中,正则表达式中的问号?表示前面的字符出现0次或