up:: Java正则表达式字符匹配
一:元字符
好好理解下元的含义! 元可以看成是一种指代,是后续基础的支撑性的东西!
下面的几个例子,正则表达式的匹配条件都是 字符串 ,只是这个字符串的某些字符可能是没有定死的而已,而是使用了元字符去指代;;;自然,如果正则表达式的匹配条件是字符串的话,其匹配结果也会是字符串!这种字符串形式的正则表达式应该是以后最常使用的形式。。。
示例1:匹配:四位整数六位小数的一个数字,如3467.798789:
示例2:匹配杭州与宁波的座机号码(0571|0574-XXXXXXXX):
示例3:匹配十八位身份证号:省份证号的规则是前面有17位数字,最后一个可能是数字也可能是X或x
身份证号的第一位的范围是1234568这几个数字:
可以采用的正则表达式可以是:[1234568]\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d[0-9xX]
二:多次重复匹配
{},*,+,?是一个多次重复匹配修饰符,跟在其他字符后面,用来和其他字符组合使用……
同样是上面身份证号的匹配:[1234568]\d{16}[0-9xX]。同样可以达到效果
示例1:验证短信呢验证码(6位数字)
示例2:匹配全国座机号(区号3或4位-电话号码7或8位):
示例3:匹配英文姓名
(如Gavin Wang:前面是名后面是姓,两个首字母大写,全部都是英文字母;名字都多个英文字母,姓在有的时候只写一个大写的英文字,如上面也可写成Gavin W):
可以写成:[A-Z][a-z]{1,}\s[A-Z][a-z]{0,}
也可写成:[A-Z][a-z]+\s[A-Z][a-z]*
…………………………
注:
三:定位匹配
某个字符串以什么什么开头,以什么什么结尾的时候,需要用到定位匹配;
.:点代表任意单个字符 *:星号代表0-无限多个;;;;
示例:
有的场景中需要限制字符数量,如:
在实际工作中, ** 头尾同时匹配** 也很常见常见 :
四:贪婪模式&非贪婪模式
贪婪模式:
非贪婪模式:
示例:
如果正则表达式写作:“.*“:是不行的
之所以会这样,是因为正则表达式中采用的是贪婪模式,贪婪模式是尽可能多地去匹配!
在描述数量的*后面增减一个问号:
”.*?”:
五:表达式分组
可以发现, 通过表达式分组可以组合成更加复杂的【正则表达式的字符串】,从而可以匹配出更加复杂的字符串; ;;同时表达式分组也可让正则表达式更加清晰,可读性高点;;;
示例1:匹配验证码(4位或6位):
这个例子主要体现:和|组合使用
示例2:匹配车牌号(鲁A-G894Y)
这个例子主要体现:表达式分组可以让正则表达式更加清晰;
车牌号规范是:一个汉字,一个大写字母,一个横杠 ;然后有5个字母和数字的组合;
可以采用:^[鲁黑晋豫][A-Z]-[A-Z0-9]{5}$ 但这样表达式有点混乱,不清晰
可以采用分组表达式:^([鲁黑晋豫][A-Z])-([A-Z0-9]{5})$ 这样看起来更加清晰
示例3:匹配中文或英文姓名
这个例子主要体现:表达式分组可以应对更加复杂的情况
英文姓名:
可以采用:^[A-Z][a-z]+\s[A-Z][a-z]*$
如果匹配的是中文名称,并且想和上面的形式进行兼容,应该怎么做?
\u4e00-\u9fa5:Unicode码中中文汉字的编码区间,可以用来判断是不是中文
匹配中文名字可以采用:^[\u4e00-\u9fa5]{2,4}$ 是全匹配,这儿默认,一个人的名字最多有四个汉字;
然后,采用表达式分组,将英文的和中文的组合在一起就行了:(^[\u4e00-\u9fa5]{2,4})
疑问:全字匹配
其实这样一看,全字匹配不适合用于在很长的一个字符串中搜索某些子字符串的场景!而是适用于判断某个字符串是否符合特定规范的场景!
下面有的可以,有的不可以,为了理解这个,就需要明白 全字匹配 的意思了;
^[\u4e00-\u9fa5]{2,4}$:的意思是:需要匹配的字符串需要同时满足两个条件,(1)开头结尾是汉字;(2)长度在2-4个之间;;;因为“张三你好rrr”无法同时满足上面两个条件,所以无法匹配!