最近突然想起来以前学的乱七八糟的正则表达式,所以现在巩固一下。
首先要明确一点 正则表达式是一门新的语言,而非只属于Java。
(本文也不太适合初学者看,还是先百度一些基础再来看看比较好)
java的正则表达式涉及到2个类,分开来说。
1.Pattern 这个类是一个规则,或者说是一个表达式。
2.Matcher 这个类是一个结果,或者说结果集。
(以上两点 --- 也许事实并不是这样的,犹豫比较复杂,不深入讨论)
首先熟悉一下常用的符号,这些符号非常好找,只要百度你就可以找到一大堆。我挑一些重要的记录下:
* + ? [ ] { } ( )
0个或多个 1个或多个 1个或0个 表示范围 表示匹配次数 表示分组
而在[ ]符号中,表示范围时,又有3种运算符,如果两个范围直接不写任何符号,则表示是'或'的关系。
[ ]之中无论有多少个字符,它均代表匹配一个字符!
例如:
"或" 的关系 符号为"|" 或者不写
[abc] 则表示匹配一个字符,字符为abc之中任意之一。
[0-9a-zA-Z] 则表示匹配0-9,a到z,A到Z的任意之一的字符。
以下写法等同于:[abc]
[a|b|c]
"非"的关系 符号为"^"
[^abc] 匹配除abc之外的字符。
"且"的关系 符号为"&"
[a-z&abc] 匹配a-z之中的,而且必须是abc之中的。
{}符号为匹配的次数,它和符号"+","?","*"是等价的,只是含义不同。
例如:
[abc]+ 匹配一个或多个 abc之一的结果。
a{1} 匹配出现一个a
d{1,} 匹配出现一个或者多个数字
\d{1,3} 匹配出现一个或大于1个但是小于等于3个数字。
接下来是正则表达式的创立者提供的一些简便范围,规定如下
.(点) 匹配 任意字符
\d 匹配 [0-9]
\D 匹配 [^0-9]
\w 匹配 [a-zA-Z_0-9]
\W 匹配 [^a-zA-Z_0-9]
\s 匹配 [ \t\n\f\r]
\S 匹配 [^ \t\n\f\r]
接下来是一些特殊字符,比如边界匹配:
^ 表示行首
$ 表示结尾
\b 表示单词结尾
还有一点是需要注意的,对于特殊字符,比如你想匹配“.”(点),但是"."(点)在正则表达式之中有它自己的含义,所以你需要转义,正则表达式中的转义用"\"表示,即你应该写成"\.",但是java中"\"为特殊符号,还需要转义,所以在Java中,所有出现"\"的地方都需要转义,java的转义也是"\",所以“.”你应该写成"\\."。其它包含"\"的地方类似处理。
会了以上这些规则,现在可以写一些简单的例子了。
比如这个,用来检查IP地址:
\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}
Java中的写法如下:
public static boolean checkIp(String ip,String rules){
Pattern p = Pattern.compile(rules);
Matcher m = p.matcher(ip);
return m.matches();
}
Pattern利用compile来生成一个规则,Matcher通过Pattern的matcher()方法生成,而Matcher就是一个结果集。
Matcher的matches()方法就是是否匹配,返回一个布尔类型。
接下来介绍一个Matcher类的方法:
reset() 数据指针回滚。(由于Matcher类的matchers,find方法都会导致数据游标指针的滚动,所以此方法表示重置指针)
find() 匹配子串是否有匹配的结果
lookingat() 匹配子串是否有匹配的结果,每次都会重头开始寻找。
start() 匹配子串的起始位置(随指针改变而改变,即每一次find()都会改变这个的值)
end() 匹配子串的结束位置(随指针改变而改变,即每一次find()都会改变这个的值)
group() 匹配正则表达式中的分组符号,即"()".默认group的0为整个字符串
例子有时间再上,先写到这吧。欢迎一起讨论。