初探正则

什么是正则表达式

   首先   正则表达式   是一个字符串
   这是一个什么字符串呢?  一个描述 特定字符串 的  字符串

先来上两个正则

兼容老旧的15位身份证 和现代18位身份证的正则:
单纯的正则:

        ^\d{15}(?:\d{3}|\d{2}[xX])?$

java版:
这里写图片描述

中国人名字的匹配,可以匹配新疆人名带点得名字的正则:
单纯的正则:

        ^[\u4e00-\u9fa5]+(?:[.·.•][\u4e00-\u9fa5]+)*$

java版:
人名的匹配
人名的匹配
这里出来两个长得很像的表达式是相同的效果,文章的结尾会说明为什么会这样。

1. 正则的组成

元字符

  表达式本身的保留字符   好比java中得保留字if
  如[] + * \ ?

字符组

字符组 是表示一个字符。
仔细阅读下上一行没有看错 ,一个组表示一个字符,组中的内容只是为了描述这个字符的所有可能性。
如:[as0-9]  ,这就表示一个字符 ,这个字符可以是a   s   0 1 2 3 4 5 6 7 8 9 中得任意一个。 

字符组的特殊用法

   [-0-9]    - 在字符组中有 A to B 表示范围的意思  放在首位就只是普通的 -  

   [^0-9]   ^在字符组的最开始  表示 非!   
   阅读时只需要假装看不见^,看后面的内容,最后
   的意思就是除去后面的内容,为这个字符的可能的所有情况。

   [*.?+]  大部分原字符被丢进字符组后 就不在是保留字了
    他是什么就是什么,相当于转义。很明显正则使用的时候  
    使用正则字符串作为规则,去匹配目标字符串,如果目标字符串
    中含有正则中得元字符,我们就必须转义。(   \+  ,这样也
    是可以让元字符丧失保留字意义)

普通字符

除了元字符以外的字符,当然有时候 一个字符是不是元字符,取决于他在字符组里还是字符组外面。

2. 量词

ba{6,8}
表示b字符后面有紧跟6~8个a,量词{6,8}是修饰紧贴在他前面的a
如果你要修饰ba  就要写成(ba){6,8}

?相当于 {0,1}  出现0次或1次

+相当于 {1,}  出现1次到任意多次(逗号后面啥不写表无穷)

*相当于{0,}  出现0次到任意多次

{9}相当于{9,9}

3. 元字符的意思 以及 几个转义

| 或

{}是用来包住量词的

[]是用来表示字符组的

?+*请看量词的意思

.表示任意字符(当然只有他是元字符的时候是这样,因为[.]时他就只是个.)

\s表示空白符(有哪些请百度)

\d表示0~9(digital)

\w表示0~9和a~z和A~Z(word)

\S表示除了\s以外的字符可能

\D和\W同理(如果同理不出,请关闭此页)

^表示行首,[^chun]字符组中放在首位 表示非

$在单行模式下表示行尾

4. 关于贪婪

正则表达式:".*"

目标串:"why"amI"stupid"

匹配结果 "why"amI"stupid"



正则表达式:"[^"]"

目标串:"why"amI"stupid"

匹配结果 "why"   和   "stupid"

第一个表达式为什么会匹配整个目标串呢,因为正则是一个贪婪的孩子,他会继续向后尝试,能匹配越长越好。

正则表达式:(holy){1,2}

目标串:holyholyholy

匹配结果 holyholy     holy

使正则变的不贪婪的一种方式,在量词后紧紧贴着? 使以下正则在匹配到1后就不会去尝试2

正则表达式:(holy){1,2}?

目标串:holyholyholy

匹配结果 holy    holy     holy
上面是匹配了三段

结尾

中国人名字的匹配,可以匹配新疆人名带点得名字的正则:

       ^[\\u4e00-\\u9fa5]+(?:[.·.•][\\u4e00-\\u9fa5]+)*$

java版:
人名的匹配
人名的匹配

java版的两个正则为什么长得不一样效果却相同

首先要明白在java的字符串中\是一个保留字符 他是用来做转义的。
“\ \”在java中其实就是 打出一个\

java的字符串 刚巧提供了\uXXXX 的转义unicode的功能

更巧的是 正则表达式也提供了\uXXXX转义unicode的功能

所以
第一个图片的正则是 java字符串对unicode进行了转义
第二个图片的正则只是用了java“\ \“的这个转义 把\uXXXX交给了正则表达式

大约写到这里能记录下初探的目的了,关于正则的环视,和正则NFA实现以及它的效率,以后有时间还会记录一下 。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值