正则表达式基础
大家好,我是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的搜索也是可以用正则匹配的。 - 也就是正则表达式中的算法决定了正则表达式的性能?
应该是很重要的影响原因。 - 服务器的日志处理是用的正则吗?看着像命令。
日至处理需要选出关键信息,也是用正则匹配的。
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~
作者:闵仕宇
不足之处,欢迎指正~