加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式小结

发布时间:2020-12-13 21:57:15 所属栏目:百科 来源:网络整理
导读:如果你只是想找一个你要用的正则表达式,那么可能下面就会有,如果你想了解正则表达式的原理概念,请移步中间的分割线下的 中文 :[u4e00-u9fa5] email:[w!#$%'*+/=?^_`{|}~-]+(?:.[w!#$%'*+/=?^_`{|}~-]+)*@(?:[w](?:[w-]*[w])?.)+[w](?:[w-]*[

如果你只是想找一个你要用的正则表达式,那么可能下面就会有,如果你想了解正则表达式的原理概念,请移步中间的分割线下的

中文 :[u4e00-u9fa5]
email:[w!#$%&'*+/=?^_`{|}~-]+(?:.[w!#$%&'*+/=?^_`{|}~-]+)*@(?:[w](?:[w-]*[w])?.)+[w](?:[w-]*[w])?
网址:[a-zA-z]+://[^s]*
国内电话号码:d{3}-d{8}|d{4}-{7,8}
QQ:[1-9][0-9]{4,}
邮编:[1-9]d{5}(?!d)
身份证号码:^(d{6})(d{4})(d{2})(d{2})(d{3})([0-9]|X)$
匹配日期:([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))
正整数:^[1-9]d*$
负整数:^-[1-9]d*$
整数:^-?[1-9]d*$
非负整数:^[1-9]d*|0$(正整数+0)
正浮点数:^[1-9]d*.d*|0.d*[1-9]d*$

====================================================================================================================================

正则表达式是什么?

正则表达式是一种描述性的语言,用来概括一类字符串 (或者说一个字符串集合). 我们当然可以用自然语言来描述一类字符串,比如我们说,

  • 以 “010 开头的电话号码”,
  • “夹在HTML 的中间的内容”,
  • “含有 hello 的字符串”,
  • “负数”,
  • “IP地址”
  • “邮箱地址”,等等.

最基本的正则表达式,只有三句话:

第一句话:一个字符串是一个正则表达式,比如 aaa,就是一个正则表达式,它描述了一个字符串集合,这个字符串集合里面只有 aaa 这一个元素

第二句话:两个正则表达式可以直接串起来,比如 aaabbb 其实,是由六个正则表达式 a a a b b b 接起来组成的. 我们先笼统的说,接起来就等于把描述的内容接起来,等一下再详细解释接起来的含义.

两个字符串,比如 aaa 和 bbb,用 | 连起来,变成了 aaa|bbb,也构成一个正则表达式,它描述的字符串集合是原来分别的并集,比如 aaa|bbb 描述了一个集合,这个集合里面有 {aaa,bbb} 两个字符串.

好了,就这两三话,就可以解释正则表达式最基本的思维方式了:用一个表达式,去描述一类字符串(或者说,一个集合)

拓展开

光有这两个,还不够强大,因为上面的正则表达式,我写几个,就描述了几个字符串,也就是说,描述来,描述去,都是有限的集合,不能描述无限的集合. 而我们想要描述的整数啊,域名啊,邮箱地址啊,都是一切就有可能的,因此,我们有必要引入一个新的记号,能够描述无限的集合,

一个正则式 X 可以加上一个 *,用来描述任意多个原来 X 描述的字符串拼起来的字符串.

这句话比较费解,我们用例子来说明一下,比如 a* 这个正则表达式,我们知道 a 描述了一类字符,这类字符里面只有一个 a,所以,a* 描述了一个或者多个 a.

我们再看 a | b*,按照定义,这个正则表达式描述了 a 和 b,bb,bbb 等. 如果我们引入一个括号,写成 (a|b)*,那么 a|b 就变成一个整体,描述了 a 或者 b,这时候,(a|b)* 就是一切只由 a,b 组成的字符串. 这里的括号,是为了避免歧义,表示 * 是作用在 a|b 整体上的. 这时候,(a|b) 描述了 a 和 b,整体加了一个,意味者我们可以任意选 a 或者 b 一个接一个拼起来,aba,aab 都是在 (a|b)的那一类里面的. 注意,* 可以匹配 0 个,就是说,这里面包含了什么都没有. 比如说 ab_c 也描述了 ac,因为中间可以有 0 个 b. 如果您想至少要一个b,可以写成 abb_c.

为了帮助您理解接起来,我们再看一个复杂的例子,o(n|ff). 我们知道,n|ff 描述了 n 或者 ff. 当我们直接把 o 接在前面的时候,描述的是 on 或者 off. 就是说,接起来的时候,要把 o 和后面每种情况都组合一次. 我们再看 (a|o)(n|ff). 前面描述的是 a 或者 o,后面描述的是 n 或者 ff,接起来,描述了 an,aff,on,off.

我们都知道,正则表达式描述的是一类字符串,X 和 Y 在接起来变成 XY 以后,自然的变成了描述 每一种 X 里面的字符串和 Y里面字符串接起来的情况. 同样,* 好像把 X 和自己接起来多次一样 (可以是任意次),每次只要接起来的是X里面的字符串,就一定被 X* 所表述.

(熟悉集合的朋友立即知道 正则表达式是用一个表达式代表了一个集合,X|Y 等价于两个集合的并集,而 XY 拼起来等价于他们所有的元素 x,y 拼起来的集合).

好了,恭喜您,您已经学会正则表达式了

真的,你已经全部学会了正则表达式的知识. 不过不着急,我们先回顾一下正则表达式的要点:

  1. 正则表达式由普通的字符,以及几个特殊的字符,即 括号 (),或者 | 和 星号 * 组成. 用来描述一类字符.
  2. | 表示或者. 如果有两个正则表达式 X 和 Y,那么 X|Y 就描述了原来 X 描述的和 Y 描述的.
  3. 正则表达式可以接起来,变成一个更长的,描述了一个各个部分被那些被接起来的正则表达式描述的字符串.
  4. () 是为了避免歧义.

我们上面说的这四个,就是 100% 如假包换的正则表达式了. 以后的,都是为了更加方便的使用正则表达式,而又引入的一些扩展. 恰恰是这些扩展,让初学者陷入了细节的泥潭. 我们在下一节,一个一个的来对付诸如 +,[,-,],^,$,{m},等这些非基本的高级的功能. 需要强调的是,这些高级的功能,其实都只是为了人书写方便,而且是完全可以用我们这里说的最基本的几个规则代替的. 这些高级功能,。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读