正则表达式可以用来操作字符串数据,是通过一些特定的符号来体现的。
正则表达式的常见规则:
[abc] a、b或c(简单类)
[^abc] 任何字符,除了abc
[a-zA-Z] a到z或者A到Z
[a-d[m-p]] a到d或者m到p
[a-z&&[def]] a到z与def之间的交集。
. 任何字符
\d 数字[0-9]
\D 非数字[^0-9]
\s 空白字符
\S 非空白字符
\w 单词字符[a-zA-Z_0-9]表示大小写字母或下划线或数字
\W 非单词字符
^ 行的开头
$ 行的结尾
\b 单词边界
X? X,一次或者一次也没有(要么没有,要么有一次)
X* X,零次或者多次(要么没有,要么有多次)
X+ X,一次或多次
X{n} 恰好n次。
X{n,} 至少n次
X{n,m} 至少n次,之多m次
正则表达式对字符串的几种常见的操作:
/*
* 演示获取
* 将正则规则进行对象的封装。
* Pattern p = Pattern.compile("a*b");
* //通过正则对象的macher方法字符串相关联,获取要对字符串操作的匹配器对象Macher.
* Macher m = p.macher("aaaaab");
* //通过Matcher匹配器对象的方法对字符串进行操作。
* boolean b = m.maches();
*
*
*/
public static void functionDemo_4() {
String str = "da jia hao, ming tian bu fang jia!";
String regex = "\\b[a-z]{3}\\b";//获取字母数为三的字符串,需要考虑到边界.
//1 将正则封装成对象
Pattern p = Pattern.compile(regex);
//2 通过正则对象获取匹配器对象
Matcher m = p.matcher(str);
//使用Matcher对象的方法对字符串进行操作。
//既然要获取三个字母组成的单词,就需要查找。
System.out.println(str);
while(m.find()){
System.out.println(m.group());//获取匹配的子序列
System.out.println(m.start() + ":" + m.end());//获取子序列在原序列中起始和终止的位置
}
}
/*
* 演示替换
*/
public static void functionDemo_3() {
String str = "xiaoqiangttttzhangsanbbbbblisi";
// str = str.replaceAll("(.)\\1+", "#");//将所有的叠词都换成#
str = str.replaceAll("(.)\\1+", "$1");//将叠词替换成单个的原来的字母,即将tttttt替换成t
//$符号表示获取上一个正则表达式的符号。1表示上一个正则表达式的第一个元素。
System.out.println(str);
String tel = "15800001111";//实现将号码显示称为158****1111
tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
// tel = tel.replaceAll("(\\d{3})(\\d{4})(\\d{4})", "$1****$3");//组号按照左括号数,与上述语句实现相同的功能。
System.out.println(tel);
}
/*
* 演示切割
* 组:(A(B(C))) 4组 1(A(B(C))) 2\A 3(B(C)) 4(C)
* 捕获组可以通过从左到右计算开括号来编号
* 组零始终代表整个表达式。
*
*
*/
public static void functionDemo_2() {
// String str = "xiaoqiang zhangsan lisi";
// String[] names = str.split(" +");
// String str = "xiaoqiang.zhangsan.lisi";
// String[] names = str.split("\\.+");//.是正则表达式中的特殊符号,需要进行转义\\.
String str = "xiaoqiangttttzhangsanbbbbblisi";
String[] names = str.split("(.)\\1+");//组,将.封装成组,即任意符号,组号为1,这组任意符号可以重复一次或者多次。(.)\\1+则表示叠词
for(String name : names){
System.out.println(name);
}
}
/*
* 演示匹配
*/
public static void functionDemo_1() {
//匹配手机号码是否正确。
String tel = "15800001111";
// String regex = "1[358][0-9]{9}";//范围用[]表征,次数用{}表征
String regex = "1[358]\\d{9}";//"\\d"
boolean b = tel.matches(regex);
System.out.println(tel+":"+b);
}
正则表达式的几个案例:
/*
* 1,治口吃
*/
public static void test_1(){
String str = "我我...我我我..我要要....要要要..要要学学学....学学....学学编编....编编编..编编编程程程...程程..程";
//1,将字符串中的.去掉,用替换方法
str = str.replaceAll("\\.+", "");
//2,替换叠词
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
/*
* 2、ip地址排序
* 192.168.10.33 127.0.0.1 105.70.11.55 3.3.3.3
*/
public static void test_2(){
String ip_str = "192.168.10.33 127.0.0.1 105.70.11.55 3.3.3.3";
//1,为了让ip可以按照字符串顺序进行比较,只要让ip的每一段的位数相同
//所以,补零。按照每一位所需做多0进行补充。每一段都加两个0。
ip_str = ip_str.replaceAll("(\\d+)", "00$1");
System.out.println(ip_str);
//然后每一段保留数字3位
ip_str = ip_str.replaceAll("0*(\\d{3})", "$1");
System.out.println(ip_str);
String[] ips = ip_str.split(" +");
TreeSet<String> ts = new TreeSet<String>();
for(String str :ips){
ts.add(str);
}
for(String ip :ts){
System.out.println(ip.replaceAll("0*(\\d+)", "$1"));
}
//1 将ip地址切出
/*String[] ips = ip_str.split(" +");
TreeSet<String> ts = new TreeSet<String>();
for(String str :ips){
ts.add(str);
}
for(String ip :ts){
System.out.println(ip);//按照字符串排序排序结果错误,因为ip地址的每一位的位数不同
}*/
}
/*
* 3,校验邮件地址
*
*
*/
public static void test_3() {
String mail = "abc@sina.com";
String regex = "[a-zA-z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{2,3})+";
regex = "\\w+@\\w+(\\.\\w+)+";//笼统式匹配
boolean b = mail.matches(regex);
System.out.println(mail+":"+b);
}
简单的网页爬虫案例(从网页html文件中爬邮箱地址):
/*
* 从所给网址中找出邮箱,并存储在list中。
*/
public static List<String> getMailsByWeb() throws IOException {
URL url = new URL("http://hao.360.cn/mkt.html");
BufferedReader bufr = new BufferedReader(new InputStreamReader(url.openStream()));
//对读取到的数据进行规则匹配,从中获取符合规则的数据。
String mail_regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while((line=bufr.readLine())!= null){
Matcher m = p.matcher(line);
if(m.find()){
//3,将符合规则的数据存储到集合中。
list.add(m.group());
}
}
return list;
}
/*
* 从所给html文件中搜寻邮箱,并返回到list中。
*/
public static List<String> getMails() throws IOException{
//1,读取源文件
BufferedReader bufr = new BufferedReader(new FileReader("mail.html"));
//对读取到的数据进行规则匹配,从中获取符合规则的数据。
String mail_regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while((line=bufr.readLine())!= null){
Matcher m = p.matcher(line);
if(m.find()){
//3,将符合规则的数据存储到集合中。
list.add(m.group());
}
}
return list;
}