最近有了点时间,就回头看了一下《学习正则表达式》这本书。怎么说呢,这本书适合从零开始学习正则表达式或者有一点基础可是想要增强这方面能力的读者。这本书的风格是“实践出真知”,使用概括方式讲述, 也就是说, 会从特例讲起, 最终归结到通常状况。不会先陈述观点, 而后举例, 而是先为你们展现示例, 而后概括出通常性结论。因此刚开始的话仍是有点不习惯这种风格。正则表达式
吐槽只是皮一下而已啦,这本是仍是能够的,感兴趣的小伙伴不妨去看看,书本不厚,也就140页左右。【附上pdf】缓存
典型的搜索和替换操做要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺少灵活性,若采用这种方法搜索动态文本,即便不是不可能,至少也会变得很困难。函数
经过使用正则表达式,能够:工具
“正则表达式是描述一组字符串特征的模式, 用来匹配特定的字符串。 ”
——Ken Thompson 学习
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操做的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。测试
——百度百科spa
定义千万条,真理就一条。简单来说,正则表达式描述了一个规则,经过这个规则能够匹配一类字符串。这里须要注意一下,正则表达式是一个规则。.net
这里有个辅助理解正则表达式的一个工具,Regexper 。regexp
上面这个示例展现的是利用正则表达式匹配手机号码,正则表达式为/^1[34578][0-9]{9}$/,从生成的辅助图能够看出,这个正则的规则是检测以1开头,第二位为三、四、五、七、9 其中一个,以9位(自己1次加剧复8次)0-9数字结尾的的字符串。有了这个工具,能够很形象的帮助咱们理解正则表达式。是否是很赞?好了好了,该回归正题了。该铺垫的已经铺垫了,改举例的也举例了,那么接下来就该讲讲最基本的语法啦。come on!htm
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为“元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式做为一个模板,将某个字符模式与所搜索的字符串进行匹配。
普通字符包括没有显式指定为元字符的全部可打印和不可打印字符。这包括全部大写和小写字母、全部数字、全部标点符号和一些其余符号。
好比说正则表达式/is/ 匹配字符串'is',表达式里面的字符串is就是普通字符'i'和's'构成。
非打印字符以下:
固然,正则表达式里面的标准字符不止这些,因为本篇是入门篇,一些不常见或者比较复杂的字符符号在这里就不涉及,想要了解的能够随时问度娘。
许多特殊字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符 (\) 放在它们前面。要匹配 $ 字符自己,使用 \$。要匹配 |,使用 \|。要匹配\,使用 \\ 。
修饰符与其余语法特殊,字面量方法声名的时候放到//后,构造函数声明的时候,做为第二个参数传入。整个正则表达式能够理解为/正则表达式主体/修饰符(可选)。
常见写法好比:regex=/x/g、regex=/xXX/i 等,也能够多个修饰符同时使用,好比regex=/xXX/ig,表示不区分大小写而且全局匹配。
用圆括号将全部选择项括起来,即彻底匹配,相邻的选择项之间用|分隔,即多选一。但用圆括号会有一个反作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种反作用。
上面栗子reg=/x|y/,表示匹配字符x或y。
上面说到圆括会把相关的匹配缓存,什么意思呢?在正则里面,对一个正则表达式模式或部分模式两边添加圆括号将致使相关匹配存储到一个临时缓冲区中,所捕获的每一个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每一个缓冲区均可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。这就是正则里面的反向引用。
关于反向?
正则表达式中有前瞻(Lookahead)和后顾(Lookbehind)的概念,须要注意一点,正则表达式中的前和后和咱们通常理解的先后有点不一样。一段文本,咱们通常习惯把文本开头的方向称做“前面”,文本末尾方向称为“后面”。可是对于正则表达式引擎来讲,由于它是从文本头部向尾部开始解析的(能够经过正则选项控制解析方向),所以对于文本尾部方向,称为“前”,由于这个时候,正则引擎还没走到那块,而对文本头部方向,则称为“后”,由于正则引擎已经走过了那一块地方。
好比正则表达式/(abc)d\1/匹配 abcabcd abcabcdabccca ,(abc)d\1能够匹配字符串abcdabc,即\1表示把获取到的第一组再匹配一次。
限定字符又叫量词,是用于表示匹配的字符数量的,即一个给定组件必需要出现多少次才能知足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。
定位符使您可以将正则表达式固定到行首或行尾。它们还使您可以建立这样的正则表达式,这些正则表达式出如今一个单词内、在一个单词的开头或者一个单词的结尾。
定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。
reg=/1234/能匹配字符串0123456,而reg=/^1234/不能够,由于这里加了定位符,要求必须是以1开头的字符串,好比匹配12345。
\b匹配一个边界。因此若是使用正则表达式/\bword\b/ 匹配"word"、"a word"、"a word D"都是能够的。想想这个字符串"a word."能匹配成功吗?
答案是能够的。有人可能就有疑问说,\b匹配的是否是字边界吗,word后面直接接了一个点,而不是空格或者没有其余东西。哈哈,其实大家都理解错了。\b匹配的这个边界,指[a-zA-Z_0-9]以外的字符,即不是\w字符,因为.不属于\w字符,因此就可以匹配成功。你们能够本身试试看,利用网上的正则表达式测试工具本身动手试一下,好比 https://www.regexpal.com/。
注意:不能将限定符与定位点一块儿使用。因为在紧靠换行或者字边界的前面或后面不能有一个以上位置,所以不容许诸如 ^* 之类的表达式。
方括号[ ]表示字符集合,即[ ]表示自定义集合,用[ ]能够匹配方括号里的任意一个字符。reg=/[aeiou]/匹配'a','e','i','o','u'任意一个字符。/[0-9]/则表示匹配数字0-9之中其中一个,/[a-zA-Z]/则匹配全部大小写字母中的一个字母。/[a-zA-Z0-9_]/则等效于\w。
可是,特殊字符(除了小尖角'^'和中划线'-'外)被包含到方括号中,就会失去特殊意义,只表明其字符自己。reg=/[abc+?]/匹配'a','b','c'任意一个字符或者'+','?',即包含在自定义集合中的特殊字符'+','?'失去了特殊含义,只表示其字符自己的意思。
特殊字符小尖角'^',本来含义是匹配字符串的开始位置,若是包含在自定义集合[ ]中,则表示取反的意思。好比:reg=/[^aeiou]/匹配'a','e','i','o','u'以外的任意一个字符。
中划线'-',在自定义集合[ ]中,表示“范围”,而不是字符'-'自己,reg=/[a-z]/,匹配从a到z中26个字母的任意一个。
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式很是相似。
相同优先级的从左到右进行运算,不一样优先级的运算先高后低。下表从最高到最低说明了各类正则表达式运算符的优先级顺序:
正则表达式虽然比较烦琐,但它是强大的,学会以后的应用会让你除了提升效率外,会给你带来绝对的成就感。
正则表达式远不止这里所涉及到的,因此这里只是入门。俗话说师傅领进门,修行看我的。加油吧,骚年。保持一颗学习的心❤!
附:正则表达式速查表:https://www.jb51.net/tools/regexsc.htm