正则表达式之字符匹配
认识正则维基百科对其的定义是:“正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。” 目前许多程序设计语言都支持利用正则表达式进行字符串操作。简单地理解就是,正则表达式是用于匹配字符串中字符组合的模式,要么匹配字符,要么匹配位置。 内容大纲目前暂定以下内容将在后期分享于诸君,本篇先介绍正则表达式里面的字符匹配,实例都将以JavaScript代码演示,其实正则没有语言界限,小生也不是强权主义,只是写来方便罢了。
模糊匹配正则表达式不仅可以精确匹配还可以模糊匹配,倘若只有精确匹配,那正则就太弱了,也不值得在此继续聊下去。 const reg = /hello,world/; console.log(reg.test('hello,world')); // => true 而强大的模糊匹配,有两个方向上的“模糊”: 横向模糊和纵向模糊。 横向模糊横向模糊指的是,一个正则可匹配的字符串的长度是不确定的,可以是多种情况。 其实现的方式是量词。例如{m,n},表示最少出现m次,最多出现n次。 可视化图如下:
测试如下: const reg = /ab{2,4}c/g; const string = 'abc abbc abbbc abbbbc abbbbbc'; console.log(string.match(reg)); // => ['abc','abbc','abbbc','abbbbc']
纵向模糊纵向模糊指的是,一个正则匹配的字符串,当匹配到某一位的字符时,并不是一个特定的字符,其有多种可能性。 其实现的方式是字符组。例如 可视化图如下:
测试如下: const reg = /a[123]c/g; const string = 'a1c a2c a3c a4c'; console.log(string.match(reg)); // => ['a1c','a2c','a3c']; 字符组
例如 范围表示法如果字符组中的字符非常多的话,怎么办呢?可以使用范围表示法。 例如“1234567abcdefgHIJKLMN”可是表示为 在这里“-”表示特殊含义,如果正则匹配需要匹配这个字符,比如匹配“a”,“h”,“-”怎么办呢? 可以写成 排除字符组在纵向匹配中,我们还会遇到一种情况,那就是我们不希望匹配到字符组的任何一个字符。例如不能匹配“a”,“b”,“c”。 此时就出现了排除字符组的概念。例如 当然,也有相应的范围表示法,例如: 常见的简写有了字符组的概念之后,我们就很容易理解系统自带的简写方式了。
如果表示任意字符,怎么办? 可以使用
量词量词也称为重复词。理解了 简写方式
贪婪匹配与惰性匹配先看一个简单的例子: const reg = /d{2,5}/g; const string = '123 1234 12345 123456'; console.log(string.match(reg)); // => ['123','1234','12345','12345'] 其中正则 但是其是贪婪的,它会尽可能多的匹配。你能给我 5 个,我就要 5 个。你能给我 3 个,我就要 3 个。 但是有时候贪婪并不是一件好事(人心不足,蛇吞象)。而惰性匹配,就是尽可能少的匹配,例如下: const reg = /d{2,5}?/g; const string = '123 1234 12345 123456'; console.log(string.match(reg)); // => ['12','12','34','56'] 其中 /d{2,5}?/ 表示,虽然 2 到 5 次都行,当 2 个就够的时候,就不再往下尝试了。 对惰性匹配的记忆方式是: 量词后面加个问号,问一问你知足了吗,你很贪婪吗? 多选分支一个模式可以实现横向匹配和纵向匹配,而多分支可以支持多个子模式任选其一。 具体形式如下 例如匹配 可视化形式如下:
测试如下: const reg = /hello|world/g; const string = "hello lemon,world is yours!"; console.log(string.match(reg)); // => ['hello','world'] 需要注意的地方是, 如下实例: const reg = /he|hello/g; const string = 'hello'; console.log(string.match(reg)); // => ['he'] 如果你的正则改为 如下实例: const reg = /hello|he/g; const string = 'hello'; console.log(string.match(reg)); // => ['hello'] 由此可知,多分支结构匹配也是惰性的,当前面匹配上之后,后面就不在匹配了。 小结正则表达式是一个优秀程序员的基本技能,本身虽然不是很复杂,但内容却比较杂乱,能一步一步理清思路是很重要的,本章主要先介绍了字符的匹配,下一章将介绍位置的匹配。 本文中的正则表达式转化为关系图来展示的工具是Regexper 此文主要参考和学习了老姚的《JavaScript 正则表达式迷你书》,内容清晰明了,在此非常感谢老姚的 free精神,致敬。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |