日常开发中,经常涉及到对一些字符串的匹配,判断,使用正则表达式可以很强大的完成各种模式的匹配;所以今天补一篇java正则表达式的博文;
正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
从以下几个方面讲述:1.组成结构2.匹配规则3.案例分析
一,组成结构
1.元字符
**”^”**:^会匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置
“$” :$会匹配行或字符串的结尾
eg:^This is Regex$
被匹配的字符必须是以This开头有空格也不行,必须以Regex结尾,也不能有空格与其它字符
“\b”:不会消耗任何字符只匹配一个位置,常用于匹配单词边界 如 我想从字符串中”This is Regex”匹配单独的单词 “is” 正则就要写成 “\bis\b”
注:\b 不会匹配is 两边的字符,但它会识别is 两边是否为单词的边界
“\d”: 匹配数字, 例如要匹配一个固定格式的电话号码以0开头前4位后7位,
如0737-5686123 正则:^0\d\d\d-\d\d\d\d\d\d\d$ 这里只是为了介绍”\d”字符,实际有更好的写法会在下面介绍。
**”\w”**:匹配字母,数字,下划线.
例如我要匹配”a2345BCD__TTz” 正则:”\w+” 这里的”+”字符为一个量词指重复的次数,稍后会详细介绍。
**”\s”**:匹配空格;
例如字符 “a b c” 正则:”\w\s\w\s\w” 一个字符后跟一个空格,如有字符间有多个空格直接把”\s” 写成 “\s+” 让空格重复
**”.”**:匹配除了换行符以外的任何字符
这个算是”\w”的加强版了”\w”不能匹配 空格 如果把字符串加上空格用”\w”就受限了,看下用 “.”是如何匹配字符”a23 4 5 B C D__TTz” 正则:”.+”
“[abc]”: 字符组 匹配包含括号内元素的字符
这个比较简单了只匹配括号内存在的字符,还可以写成[a-z]匹配a至z的所以字母就等于可以用来控制只能输入英文了
2.几种反义
写法很简单改成大写就行了,意思与原来的相反,这里就不举例子了
“\W” 匹配任意不是字母,数字,下划线 的字符
“\S” 匹配任意不是空白符的字符
“\D” 匹配任意非数字的字符
**”\B” **匹配不是单词开头或结束的位置
** “[^abc] “**匹配除了abc以外的任意字符
3.量词
上面说的元字符,都是按照逐个匹配的原子从头往后匹配,比如aaaaa字符串,\w匹配,会匹配出五个结果;而量词就是控制匹配原则的;
** ““(贪婪)* 重复零次或更多
例如”aaaaaaaa” 匹配字符串中所有的a 正则: “a*” 会出到所有的字符”a”
“+”(懒惰) 重复一次或更多次
例如”aaaaaaaa” 匹配字符串中所有的a 正则: “a+” 会取到字符中所有的a字符
注意:”a+”与”a*”不同在于”+”至少是一次而”*” 可以是0次
“?”(占有) 重复零次或一次
例如”aaaaaaaa” 匹配字符串中的a 正则 : “a?” 只会匹配一次,也就是结果只是单个字符a
“{n}” 重复n次
例如从”aaaaaaaa” 匹配字符串的a 并重复3次 正则: “a{3}” 结果就是取到3个a字符 “aaa”;
“{n,m}” 重复n到m次
例如正则 “a{3,4}” 将a重复匹配3次或者4次 所以供匹配的字符可以是三个”aaa”也可以是四个”aaaa” 正则都可以匹配到
“{n,}” 重复n次或更多次
与{n,m}不同之处就在于匹配的次数将没有上限,但至少要重复n次 如 正则”a{3,}” a至少要重复3次
把量词了解了之后之前匹配电话号码的正则现在就可以改得简单点了
^0\d\d\d-\d\d\d\d\d\d\d$ 可以改为”^0\d+-\d{7}$”。
这样写还不够完美如果因为前面的区号没有做限定,以至于可以输入很多们,而通常只能是3位或者4位
现在再改一下 “^0\d{2,3}-\d{7}”如此一来区号部分就可以匹配3位或者4位的了
4.懒惰限定符
“*?” 重复任意次,但尽可能少重复
如 “acbacb” ,我想要匹配第一个acb,如果使用正则 “a.b“会匹配出什么结果呢?他会匹配出acbacb,因为是贪心的,即,他会尽可能的匹配多的结果,所以会把cbac这几个全部匹配;使用正则 “a.*?b” 会取到”acb” ,”acb”两个匹配,原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而”acbacb”最少字符的结果就是”acb”,从acbacb的a开始,往后匹配,ab之间任意个字符所以第一次匹配到acb,因为要尽可能少的匹配,所以到这就结束了,返回acb,然后接着后面找,同理又找到acb,所以返回两个acb;再比如.匹配aaababbab的结果是:aaab,ab,ab三个,如果只想要第一个结果,可以在程序中处理:
1 | String content = "aaababbab"; |
“+?” 重复1次或更多次,但尽可能少重复
与上面一样,只是至少要重复1次
“??” 重复0次或1次,但尽可能少重复
如 “aaacb” 正则 “a.??b” 只会取到最后的三个字符”acb”
“{n,m}?” 重复n到m次,但尽可能少重复
如 “aaaaaaaa” 正则 “a{0,m}” 因为最少是0次所以取到结果为空
**”{n,}?” ** 重复n次以上,但尽可能少重复
如 “aaaaaaa” 正则 “a{1,}” 最少是1次所以取到结果为 “a”
后面还有更高级的用法,捕获分组啥的,还没咋看明白,这次就不写了,后面有时间或者遇到需要使用的情况,再研究研究;
- 本文作者: Kiven
- 本文链接: http://hzxstudio.com/2018/10/15/java1-7/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!