正则表达式基础

大家好,我是IT修真院,一枚正直纯洁善良的如刚入门的Java程序员,今天跟大家分享一下修真院官网JAVA任务二,深度思考中的知识点——什么是tcp/ip协议?TCP的三次握手指的是什么


1.知识背景
正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征。

  
正如自然语言中“高大”、“坚固”等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽象,用来描述字符串的特征。

正则表达式(简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持, 并根据自身语言的特点,进行一定的剪裁或扩展。

正则入门很容易,有限的语法规则很容易掌握,但是目前正则的普及率并不高,主要是因为正则的流派众多, 各种宿主语言提供的文档都过多的关注于自身的一些细节,而这些细节通常是初学者并不需要关注的。

基本概念

1.字符串组成

对于字符串“a5”,是由两个字符“a”、“5”以及三个位置组成的,这一点对于正则表达式的匹配原理理解很重要。

即“a”之前为位置0,“a”与“5”之间为位置2,“5”之后为位置3

2.占有字符和零宽度

表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么这个子表达式是占有字符的

子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的

3.正则表达式构成

正则表达式由两种字符构成。

一种是在正则表达式中具体特殊意义的“元字符”,另一种是普通的“文本字符”。

元字符可以是一个字符,如“^”,也可以是一个字符序列,如“\w”。

元字符(Meta Character)

1.[…] 字符组(Character Classes)

字符组可以匹配[ ]中包含的任意一个字符。虽然可以是任意一个,但只能是一个。

2.常见字符范围缩写

\d数字 \w字母或下划线 \s空白字符 \D非数字 \W”\w”取反 \s非空白字符

3.小数点

匹配除“\n”以外的任意一个字符。

4.其它元字符

^: 匹配字符串开始的位置,不匹配任何字符

$: 匹配字符串结束的位置,不匹配任何字符

\b 匹配单词边界,不匹配任何字符

5.转义字符

一些不可见字符,或是在正则中具有特殊意义的元字符,如想匹配字符本身,需要用“\”对其进行转义。

\r,\n,\,$

6.量词(限定词)(Quantifier)

{m},{m,},{m,n},*,+,?

7.分支结构(Alternation)

当一个字符串的某一子串具有多种可能时,采用分支结构来匹配,“|”表示多个子表达式之间“或”的关系, “|”是以()限定范围的,如果在“|”的左右两侧没有()来限定范围,那么它的作用范围即为“|”左右两侧整体。

dog|cat [\d]

(dog|cat) [\d]


2.知识剖析

捕获组(Capture Group)

捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或手动命名的组里,以供后面引用。

(Expression)普通捕获组

(?<name> Expression)命名捕获组

非捕获组

一些表达式中,不得不使用( ),但又不需要保存( )中子表达式匹配的内容,这时可以用非捕获组来抵消使用( )带来的副作用。

(?:Expression)

反向引用

捕获组匹配的内容,可以在正则表达式的外部程序中进行引用,也可以在表达式中进行引用, 表达式中引用的方式就是反向引用。反向引用通常用来查找重复的子串,或是限定某一子串成对出现。

\1,\2 对序号为1和2的捕获组的反向引用

\k 对命名为name的捕获组的反向引用

环视(Look Around)

环视只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度的。

(?<=Expression),(?<!Expression)z,(?=Expression),(?!Expression)

忽略优先和匹配优先

或者叫做正则表达式匹配的贪婪与非贪婪模式。

标准量词修饰的子表达式,在可匹配可不匹配的情况下,总会先尝试进行匹配,称这种方式为匹配优先,或者贪婪模式。

一些NFA正则引擎支持忽略优先量词,也就是在标准量词后加一个“?”,此时,在可匹配可不匹配的情况下,总会先忽略匹配, 只有在由忽略优先量词修饰的子表达式,必须进行匹配才能使整个表达式匹配成功时,才会进行匹配,称这种方式为忽略优先,或者非贪婪模式。


3. 常见问题
普通捕获组和命名捕获组同时存在时,命名捕获组的数字序列?

贪婪与非贪婪的区别?

反向引用是什么?


4. 解决方案
普通捕获组和命名捕获组同时存在时,命名捕获组的数字序列?

普通捕获组或命名捕获组单独存在时,group id按从左到右的“(”顺序

同时存在时,优先将普通捕获组按从左到右排group id,再将命名捕获组按从左到右排序。

贪婪与非贪婪的区别?
   
例如:Xzy is a “non-teach” mode institution created by a man called “Lao Da” who is handsome.
   
我们要获取引号里的内容
   
贪婪:”.*”获取”non-teach” mode institution created by a man called “Lao Da”
   
非贪婪:”non-teach” “Lao Da”

反向引用
   
捕获组捕获到的内容,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用。
   
源字符串:abcdebbcde
   
正则表达式:([ab])\1
   
匹配结果为“bb”,匹配开始位置为5,结束位置为7。


5. 编码实战


6.扩展思考
java对正则的支持

Pattern 类:pattern 对象是一个正则表达式的编译表示。
   
Matcher 类:Matcher 对象是对输入字符串进行解释和匹配操作的引擎。
   
PatternSyntaxException:PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。


7. 参考文献
https://blog.csdn.net/lxcnn/article/category/538256
http://www.runoob.com/regexp/regexp-tutorial.html


8.更多讨论
正则表达式基础
正则表达式基础
正则表达式基础

  • 如何用正则写一个爬邮箱的程序
    最简单的([\d]{m,n})@([\d]{y,z}).(com|cn|org|…)
  • 正则匹配使用在搜索么?
    很多搜索使用正则进行匹配,也有hash运算后的查询
  • 在什么场景或者说实现什么具体功能的时候使用正则?
    对特定需求字符串进行匹配的时候
  • 正则表达式在性能上的表现如何?
    性能跟写法和引擎都有关系。
  • linux中有哪几种命令可以使用正则表达式?
    grep、cut、find、awd、cat等都可以。
  • windows上有没有使用正则查找文件和文件内容的工具
    windows的搜索也是可以用正则匹配的。
  • 也就是正则表达式中的算法决定了正则表达式的性能?
    应该是很重要的影响原因。
  • 服务器的日志处理是用的正则吗?看着像命令。
    日至处理需要选出关键信息,也是用正则匹配的。

PPT

视频


今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

技能树.IT修真院

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~

作者:闵仕宇

不足之处,欢迎指正~