第一次接触到正则表达式是在书上,刚开始感觉这也许就只是定义了一下,没什么用,就没怎么多看。知道后来做项目的时候才发现,这东西,是非常方便好用的一个方法。
正则表达式是干什么的呢?
正则表达式:符合一定规则的表达式
作用:用于专门操作字符串
好处:可以简化对字符串的复杂操作
下面举一个具体的实例:
需求:校验qq号码。要求qq号只能5至13位,只能是数字,第一个数字不能以0开头
可能很多人看到这个,很简单啊,然后开始疯狂写代码。
我们来看看正常思路
public boolean checkQQ(String qq){
boolean flag=true;
int len=qq.length();
if(len<5||len>15){
flag=false;
}
//startWith()是String的一个方法,返回boolean类型if(qq.startsWith("0")){
flag=false;
}
char[] arr=qq.toCharArray();
for(int i=0;i
if(!(i>='0'&&i
flag=false;
break;
}
}
return flag;
}
//其中检验全是有数字构成有这样的方法。try{
long l=Long.parseLong(qq);//如果出现数字之外的会抛出异常}catch(NumberFormatException e){
flag=false;
}
下面看一看如果利用正则表达式来判断
public boolean checkQQ(String qq){
String regex="[1-9][0-9]{4-14}";
return qq.matches(regex);
}
可以很明显的看出差距。
这还是比较简单的校验规则,如果再复杂一点的话更加能够体现出正则表达式的方便之处
下面来具体讲一讲正则表达式:
1.匹配:String matches方法
调用String 中的matches()方法,返回的是一个boolean类型的值
JAVA中定义了很多种匹配格式,可以在API文档中查询
我这里书写几种常见的:字符类[abc]
a、b 或 c(简单类)[^abc]
任何字符,除了 a、b 或 c(否定)[a-zA-Z]
a 到 z 或 A 到
Z,两头的字母包括在内(范围)[a-d[m-p]]
a 到 d 或 m 到
p:[a-dm-p](并集)[a-z&&[def]]
d、e 或 f(交集)
[a-z&&[^bc]]
a 到 z,除了 b 和
c:[ad-z](减去)[a-z&&[^m-p]]
a 到 z,而非 m 到
p:[a-lq-z](减去)
//这里 [abc]只写了3个,写个个数是自己定的,比如也可以[adoenvj]等等。
//也可以写[1]表示只能为1,并且[ ]括号可以省略掉。
需求:两个字符 第一个是字母 第二个是数字
String regex="[a-zA-Z][0-9]";
意味着只能有两个字符a至z,A至Z,0至9.
需求:第一个字母只能是 abc当中的一个
String regex="[abc]";
需求:第一个字母不能是abc当中的一个
String regex="[^abc]";//加了一个符号^
需求:第一个字母是b至k的
String regex="[b-k]";
预定义字符类:
预定义字符类:.
任何字符(与行结束符可能匹配也可能不匹配)\d
数字:[0-9]\D
非数字: [^0-9]\s
空白字符:[ \t\n\x0B\f\r]\S
非空白字符:[^\s]\w
单词字符:[a-zA-Z_0-9]\W 非单词字符:[^\w]
那我们该怎么书写呢?
比如第一个字符要求是数字
String regex="\\d"; //注意要有写成\\d ,不能写成\d因为\后面的会被视作转义字符
\w该什么时候用呢?可以看到它的作用是该字符是数字或字母或下划线
这不正是注册邮箱时的要求吗,直接写个\w,多省事
Greedy 数量词X?
X,一次或一次也没有X*
X,零次或多次X+
X,一次或多次X{n}
X,恰好 n 次X{n,}
X,至少 n 次X{n,m}
X,至少 n 次,但是不超过 m 次
这个怎么使用呢,这是是判断前一个字符的出现次数
例如:要求全是数字,6至9位。
String regex="\\d{6,9}";即可
其实正则中的数量词有Greedy (贪婪)、Reluctant(懒惰)和Possessive(强占)三种。
Greedy(贪婪)数量词使用的频率高一点。
这里就不做过多说明。