25 正则表达式
25.1什么是正则表达式
正则表达式就是具有一定规则的字符串,正则表达式是用操作字符串的。
正则表达式的规则:
如:
[123],表示某一位必须是123.
[a-zA-Z]表示某一位必须是A—Z的大小写字母。
[a-m[q-z]]表示某一位必须是a-m或q-z小写字母。
[a-z&&[^def]]表示某一位必须是a-z除了def.的小写字母。
[a-z&&[^l-q]]表示某一位必须是a-z除了l-q的小写字母。
[^012]表示某一位不能是012数字。
[a-z&&[def]]表示某一位只能是def小写字母。
预定义字符
\d表示0-9数字。
\D表示[^0-9]
\w表示[a-zA-Z_0-9]
\W表示不能是大小写字母,数字和下划线:[^\w]。
\s表示空白字符
\S表示不能是空白字符:[^\s]
.表示任意字符。
注意:在使用下面有反斜线的表达式时,,因为反斜线属于转义字符,必须要再加上一个反斜线对其进行转意。如:
“\\d”.
^ | 行的开头 | |
$ | 行的结尾 | |
\b | 单词边界 | |
\B | 非单词边界 | |
\A | 输入的开头 | |
\G | 上一个匹配的结尾 | |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) | |
\z | 输入的结尾 | |
Greedy 数量词 |
| |
X? | X,一次或一次也没有 |
|
X* | X,零次或多次 |
|
X+ | X,一次或多次 |
|
X{n} | X,恰好 n 次 |
|
X{n,} | X,至少 n 次 |
|
X{n,m} | X,至少 n 次,但是不超过 m 次 |
|
正则表达式是用来操作字符串的,可以进行以下几种操作:匹配、切割、替换、获取。
1, 匹配
调用String类的matches(String regex);方法,用字符串和指定的正则进行匹配。返回值为boolean,为true表示字符串和正则表达式相匹配,否则不匹配。
如:
定义匹配手机号的正则表达式:要求,第一位不能是0,第二位只能是3,4,5,8。
public class RegexDemo {
public static void main(String[] args) {
String regex="1[3458]\\d{9}";
String str="13834530020";
System.out.println(str.matches(regex));//true
}
}
匹配用户名:要求,不能以数字开头,必须是5-15位。
public class RegexDemo {
public static void main(String[] args) {
String regex="[^\\d][\\w]{4,14}";
String str="michlejackson";
String str1="00abcdef";
System.out.println(str.matches(regex));//true
System.out.println(str1.matches(regex)); //false
}
}
2, 切割
调用String类中的String[] split(String regex);方法对字符按指定的正则表达式进行切割,返回一个字符串数组。
如:
public class RegexDemo {
public static void main(String[] args) {
//将包含不固定数量空格的姓名字符串,将空格去除。
String str="zhangsan lisi wangcai";
String regex=" +";//表示空格数出现一次或多次。
String [] arr=str.split(regex);
for(String s:arr){
System.out.println(s);
}
}
}
/*打印结果:
zhangsan
lisi
wangcai
*/
public class RegexDemo {
public static void main(String[] args) {
//将姓名字符串中的字线去除。
String str="张三ooooooo李四bbbbb旺财";
String regex="(.)\\1+";//将任意字符定义为组,第二位使用重复第一组内容,重复一次或多次。
String [] arr=str.split(regex);
for(String s:arr){
System.out.println(s);
}
}
}
/*打印结果:
张三
李四
旺财
*/
3,替换
调用 String类中的replaceAll(String regex,String str);用指定的字符串,替换匹配指定正则表达式的字符串。
如:
public class RegexDemo {
public static void main(String[] args) {
//将姓名字符串中的一人叠词替换多个叠词。
String str="张三ooooooo李四bbbbb旺财";
String regex="(.)\\1+";//将任意字符定义成组,第二位重复第一位的内容,重复多次。
str=str.replaceAll(regex, "$1");//$1表示,使用第一组的内容。
System.out.println(str);
}
}
/*打印结果:
张三o李四b旺财
*/
4,获取
要获取匹配正则表达式的字符串,需要调用Matcher对象中的group()方法,所以这里可以先将正则表达式封装成Pattern对象,再通过此对象的matcher(String str)方法,获取Matcher对象。
如:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
public static void main(String[] args) {
//获取字符串中三个字母的字符串。
String str="abc fafa afaei ppp opo ip oopp oe4 33 eee iii";
Pattern p=Pattern.compile("\\b[a-z0-9]{3}\\b");
Matcher m=p.matcher(str);
while(m.find()){
System.out.println(m.group());
}
}
}
/*
打印结果:
abc
ppp
opo
oe4
eee
iii
*/
练习:
1. 去除字符串中重复的汉字。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
public static void main(String[] args) {
String str="我我...我我...我我...要要...要要要学学学学学.......学编.编编编....编编编..程程程..程程程程";
String regex_1="\\.+";
String regex_2="(.)\\1+";
str=str.replaceAll(regex_1, "");
str=str.replaceAll(regex_2, "$1");
System.out.println(str);
}
}
/*
打印结果:
我要学编程
*/
2,IP地址排序
192.168.1.234 127.0.0.1 10.0.2.1 4.3.3.3
思路:可以先将其被零,再去零,让IP地址的长度相等,去除中间的空格,遍历数组,再添加到TreeSet集合中,完成自然排序。最后再去除多余的零。
import java.util.TreeSet;
public class RegexDemo {
public static void main(String[] args) {
String str="192.168.1.234 127.0.0.1 10.0.2.1 4.3.3.3";
str=str.replaceAll("(\\d+)","00$1");
System.out.println(str);
str=str.replaceAll("0*(\\d{3})","$1");
System.out.println(str);
String[]str_arr=str.split(" ");
TreeSet<String> ts=new TreeSet<String>();
for(String s:str_arr){
ts.add(s);
System.out.println(s);
}
for(String s:ts){
s=s.replaceAll("0*(\\d+)","$1");
System.out.println(s);
}
}
}
/*
打印结果:
4.3.3.3
10.0.2.1
127.0.0.1
192.168.1.234
*/
3,邮箱验证
import java.util.TreeSet;
public class RegexDemo {
public static void main(String[] args) {
String mail="H_123@sina.com.cn";
String regex="[\\w]+@[\\w]+(\\.\\w+)+";
System.out.println(mail.matches(regex));
}
}
3,网页爬虫
通过指定正则获取网页中的数据。
如:爬取网页中的邮箱。
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
public static void main(String[] args)throws IOException {
URL url=new URL("http://tieba.baidu.com/f?kw=%D3%CA%CF%E4");
URLConnection urlconn=url.openConnection();
BufferedInputStream bis=new BufferedInputStream(urlconn.getInputStream());
byte[]buf=newbyte[1024];
int len=0;
String regex="[\\w]+@[\\w]+(\\.\\w+)+";
Pattern p=Pattern.compile(regex);
while((len=bis.read(buf))!=-1){
String data=new String(buf,0,len);
Matcher m=p.matcher(data);
if(m.find()){
System.out.println(m.group());
}
}
bis.close();
}
}
----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------