您的位置:首页 > 编程语言 > Java开发

JAVA学习笔记-----正则表达式

2017-09-10 21:54 253 查看

符号

“*”号:零次或多次

“?”号:零次或一次

“+”号:一次或多次

“[a-z0-9]”:范围,匹配一个字符,^代表非,|代表或者,&&代表且。

例子:

[a-zA-Z]、[a-z]|[A-Z]、[a-z[A-Z]]都是或者的意思。

[A-Z&&[RFG]]:A-Z并且属于RFG中的。

“{n}”:通常和[]搭配,前面的范围重复n次。

“{n,m}”:通常和[]搭配使用,表示之前的范围重复n到m次。PS:m可以为空,代表大于n次。

例子:[a-z]{2,5}:a到z的字母重复2到5次都可以匹配,如“abcd”。

转移符号含义

“.”号:一个字符

\d:数字,[0-9]

\D:非数字的字符,[^0-9]

\s:空白符,[\t\n\x0B\f\r]

\S:非空白符,[^\s]

\w:单词字符,[a-zA-Z_0-9]

\W:非单词字符,[^\w]

特别注意:
“\\”.matches("\\\\");


注意反斜线需要使用反斜线转移,前面代表一个反斜线.正则表达式去匹配一个反斜线本来就是使用两个\,故在字符串中,需要对每个\前面加上\进行转移。故使用“\\”来匹配“\”。

边界处理

^:字符串开头,不匹配任何字符。

$:字符串结尾,不匹配任何字符。

\b:单词边界(空格、换行、特殊字符),不匹配任何字符。

\B:非单词边界,不匹配任何字符。

举例理解:

System.out.println("      \n".matches("^[\\s&&[^\\n]]*\\n$"));


理解:空白符开头但不是换行符开头且可以为多个,并且以\n结尾。

System.out.println("aaa 999c".matches("^[a-z]*\\b\\d{3}.$"));


理解:字母开头(零个或多个),单词边界(不占位),数字(3个),任意字符匹配一个。

Matcher中的mathces、reset、find、lookingAt方法

mathces():当前字符串与正则表达式是否匹配,要求整个字符串都与正则表达式匹配,才返回true;

reset():当正则表达式进行匹配时,会移动游标进行匹配,该方法把游标重置为起始位置。

find():查找字符串中是否有子串与正则表达式匹配,且移动游标。

start()/end():当find()为true时,可以通过
start()/end()
找到子字符串匹配的起始位置和终止位置,否则报错。

lookingAt():该方法不理会游标的位置,每次都会从头查找是否有子串与正则表达式匹配。

替换字符串

通过正则表达式替换字符串,返回至StringBuffer。

/*替换java(忽略大小写),第奇数个替换成小写,偶数个替换成大写*/
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava asdasdas");
int index = 0;//奇偶计数器
StringBuffer buf = new StringBuffer();
while (m.find()) {
index++;
if (index % 2 == 0) {
m.appendReplacement(buf, "java");//该子字符串替换完成后,复制到buf
} else {
m.appendReplacement(buf, "JAVA");//该子字符串替换完成后,复制到buf
}
}
m.appendTail(buf);//将剩余字符串添加到buf
p(buf);//显示buf


分组

代码解释。

要求:找到匹配的字符串,求出前几位数字。

/*一:原始方法,然后在返回结果中继续匹配*/
Pattern p = Pattern.compile("\\d{3,5}[a-z]{2}");
String s = "111aa-3333bb-222cc-11";
Matcher m = p.matcher(s);
while (m.find()) {
p(m.group());
}
/*
结果:
111aa
3333bb
222cc*/

/*二:利用正则表达式的分组功能*/
Pattern p = Pattern.compile("(\\d{3,5})([a-z]{2})");//加括号,分组
String s = "111aa-3333bb-222cc-11";
Matcher m = p.matcher(s);
while (m.find()) {
p(m.group(1));//1:第一组 2:第二组 空:所有
}
/*结果:
111
3333
222*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: