正则表达式
Posted jinliang374003909
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。
简介:作为一个开发人员的我已经和正则表达式接触过了多次,从开始的基础语法学习,到慢慢的研究正则的原理,中间是对它一点点的熟悉。网上的很多资料大都是对正则的基础学习和原理,但如果不是对真正很熟悉的话,会发现猛然给你个真正表达式还是很难阅读它的。对于这点我总结了一些小小经验与大家分享。备注:自我感觉本文并不适合初学者,而是对正则表达式有一定认识(起码要熟悉真正表达式的基础语法)的人。
一:举例
通过三个举例来验证你的正则表达式的熟悉程度
eg1:regex = "abc"
eg2:regex="ab1,3c"
eg3:regex="ab1,3?c"
eg4:regex="^([hH][tT]2[pP]:\/\/|[hH][tT]2[pP][sS]:\/\/)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~_%\/])+$";
二:如何阅读正则表达式
2.1 确定一个名词 (正则表达式的基础单元)。
一个名词即正则表达式中的一个基础单元,例如eg1中的abc其中a,b,c分别代表一个名词,即他们按顺序分别匹配字符串中的abc。
备注:“.”一个点符号也是一个名词,它可匹配任意字符
备注:“[abc]”即“[]”号也代表一个名词,它匹配[]号中的任意一个字符串
2.2 说明(或解释)名词的词(量词或形容)
量词:看过菜鸟学院的同学就应该熟悉,它在里面举例了多个量词,如 ? * + ....,它一般是修饰其前面的名词(),表示其前面的名词可匹配的数量。
如eg2中的1,3它表示b可以匹配1到3次。
形容词:^号(说明字符串要以该名词开头)和$号(说明字符串要以该名词结尾)
备注:对于用量词修饰的名词其整体(b1,3)应看成一个名词,即正则中的一个基础单元。
2.3 确定一个冠词(限定量词)
冠词是修饰量词的,在正则表达式中的冠词有 + ? 一旦被冠词修饰了的基础单位,就改变了正则表达式中的默认匹配模式(默认匹配模式是贪婪模式)。
备注:+ 号变成独占模式(相对于贪婪模式,其不会回溯)
备注:? 号变成懒惰模式(尽量匹配少的的字符串,但会回溯)
备注:回溯是指正则表达式的回溯
例如:eg3中的‘b1,3?’就是把默认的贪婪模式改变成为了懒惰模式。
2.4 认识分组
可以通过()把多个名词(基本单元),看做一个整体,即一个基本单位。如eg4其简化结构为()(().)+()+$,根据以上解释该结构应该是3个名词,其中中间名词包含了两个名词()和.。
三:正则表达式的设计思想
比如我(A)手里有一个正则表达式,另一个人(B)手里有一个待检测的字符串。为达到字符串是否符合该正则。我可以根据我手中的表达式去比较另一个人手中的字符串(以正则表达式为基准),当然还有一种方法是另一个人根据其手中的字符串是否符合我手中的表达式(已字符串为基准)。根据这两种思想就可引出正则表达式的两种引擎DFA 自动机(Deterministic Final Automata 确定型有穷自动机)和 NFA 自动机(Non deterministic Finite Automaton 不确定型有穷自动机)。
四:正则表达式引擎
即根据设计思想实现的正则表达式的两套算法
DFA 自动机:以字符串为基准
NFA 自动机:以正则表达式为基准
五:
一个功能齐全的正则表达式工具:https://regex101.com/
以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章