首页 > 其他 > 详细

正则表达式

时间:2019-09-07 10:26:50      阅读:124      评论:0      收藏:0      [点我收藏+]

看了好几次正则表达式,稍微碰到复杂的还是看不懂。

很多文章宣称,看完这编就够了。够了,真是够了,有多少人看完还是不会复杂表达式?大部分文章都没有去分析复杂例子,没有写任何体会。把教材基本语法说一说,就敢宣称,你懂了。

还是推荐https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md#41--%E6%AD%A3%E5%85%88%E8%A1%8C%E6%96%AD%E8%A8%80

配合在线练习来学习。

 

这次认真根据每个语法符号做了几个例子,比较清晰了。记录几点要点。

最基本要记住,正则表达式可以称为,贪婪得到子字符串的表达式。

1.正则表达式的基本目的就是查找目标字符串中符合表达式的 ‘子字符串’。

   1.1明确这个很重要。因为不同的语言会给表达式类附加很多功能和函数。match,find.等等。这些功能都是从这个基本目的引申出来的。千万别忘记了这些功能都是基于正则表达式的基本目的。

   1.2而且明确了这个目的也会帮助理解正则语法中的^和$符号。 记住^和$也是来找 ‘子字符串‘的,只不过^$同时出现,恰巧表达了整体匹配表达式的含义,表达出了 ‘子字符串’是整体字符串的特例的情况。

        理解^$同时出现的解释: 某个子串,必须开头匹配表达式,而且结尾也必须匹配表达式,那么如果存在匹配的子串,它也只能是整个字符串。

 

2.表达式的每个符号的语法还是要清晰的掌握。随便看一眼,是懂非懂,无济于事。

   2.1  [ ] ,表达的是  单个字符。所以才可以[^xxx],来表示 非某集合的单个符号。而 (||),表达的选择其中的字符串。(^||)是无法表达非字符的意思的。因为这个语法无法确定非之后,你需要字符的长度。这不是表达非的语法。

               要表达非子串,必须依赖 预查功能, 仔细想想,(^||),无法表达长度,而且语法也没有支持它表达任意长度。所以必须依赖 否预查,

               一段语法表示你要查的东西,附加一个预查功能,还有一个重点依然是第一要点。会有很多子串满足 非子串的功能。 

 

3.表达式默认的是贪婪模式,所以很多时候,我们并没有输入^$,  但结果是整个字符串,而不是子串。当我们明确整个全匹配,最好加上^$,而不要依赖贪婪模式,这有助于我们理解正则表达式的本意。

  还有贪婪模式的方向是贪婪的包含,而不是贪婪的非包含,所以再表达 非的时候,往往表达式和我们想要表达的意思不同。

 

以几个例子来分析正则表达式。

1.^$

2. .*

3.

^.*$

 

 

 其实仔细看下正则表达式语法真的很少了。

正则表达式的全部语法字符。

 

 

元字符

元字符描述
. 句号匹配任意单个字符除了换行符.
[ ] 字符种类. 匹配方括号内的任意字符.
[^ ] 否定的字符种类. 匹配除了方括号里的任意字符
* 匹配>=0个重复的在*号之前的字符.
+ 匹配>=1个重复的+号前的字符.
? 标记?之前的字符为可选.
{n,m} 匹配num个大括号之前的字符 (n <= num <= m).
(xyz) 字符集, 匹配与 xyz 完全相等的字符串.
| 或运算符,匹配符号前或后的字符.
\ 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ |
^ 从开始行开始匹配.
$ 从末端开始匹配.

 

 

               

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 简写字符集

 

正则表达式提供一些常用的字符集简写. 如下:

简写描述
. 除换行符外的所有字符
\w 匹配所有字母数字, 等同于 [a-zA-Z0-9_]
\W 匹配所有非字母数字, 即符号, 等同于: [^\w]
\d 匹配数字: [0-9]
\D 匹配非数字: [^\d]
\s 匹配所有空格字符, 等同于: [\t\n\f\r\p{Z}]
\S 匹配所有非空格字符: [^\s]
\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\v 匹配一个垂直制表符
\p 匹配 CR/LF (等同于 \r\n),用来匹配 DOS 行终止符

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

零宽度断言,

说人话:匹配表达式的附加条件,

我要找小红旁边的(断言)男孩子。所以我要找的是男孩子,小红的不要(零宽度)。

 

 

符号描述
?= 正先行断言-存在
?! 负先行断言-排除
?<= 正后发断言-存在
?<! 负后发断言-排除

 

  后面应该有

 后面不应该有

前面应该有

前面不应该有

 

 

 

学习中途的理解

//思考一个表达式语法如何可以表示任何东西?首先必须有语法表示:
//某子段表达式出现0到无数次。只有掌握重复自己的技能,才有从有限到无限的可能。
//所以需要有1,表示子段的能力。2表示重复次数的能力。
//其次必须有1.表示某个符号的能力,2.表示任意符号的能力,3.表示某组符号中的一个的能力。那么这样的话,和前面的能力结合,理论上就可以表示任何东西。
//当然扩展开来,有一个非符号,在某些情况下,可以表达更简洁,特别注意非,首先是某个可以表示确定含义的语法(确定的长度和符号范围)才能去非。[]是确定的语法,确定了1长度。任意字符为范围。
//而对于匹配后的继续子匹配,可以在一次匹配中就表达出。需要扩展语法。java 用().
//其实 regex 晦涩就在于细节多,碎片学习的话,可能就会对于()的分组作用漏学。导致误认为是选择含义,产生各种疑惑。因为各种组合表示可以有多种语法表示,有的简洁,有的复杂。所以加大了看懂别人表达式的难度。
//[]是单个字符含义,()是选择和分组。{} 是表示重复概念。

正则表达式

原文:https://www.cnblogs.com/lsfv/p/11479081.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!