概念
正则表达式通常被用于判断语句,用来检查某一个字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。
1.限定修饰符:在正则表达式中国允许使用限定修饰符来限定元字符出现的次数。
2.常见正则表达式创建的快捷符号:
3.在正则表达式中可以使用方括号括起来若干字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。
代码示例:
package regex.demo;
/*
正则表达式
正则表达式用于操作字符串数据
通过一些特定的符合来体现的
所以为了掌握正则表达式,必须要学习一些符号
虽然简化了,但是阅读性差
*/
public class RegexDemo {
public static void main(String[] args) {
String qq="1234567865j";
// checkQQ(qq);//非正则表达式的方法
String regex="[1-9][0-9]{4,14}";//正则表达式
boolean b=qq.matches(regex);
System.out.println(qq+":"+b);
String str="aoob";
String reg="ao?b";//ao+b ao*b
System.out.println(str.matches(reg));
}
public static void checkQQ(String qq){
/*
需求:定义一个功能对qq号进行校验
要求:长度5~15,只能是数字,0不能开头
*/
int len=qq.length();
if(len>=5&&len<=15){
if(!qq.startsWith("0")){
try{
long l=Long.parseLong(qq);
System.out.println(l+":正确");
}catch(NumberFormatException E){
System.out.println(qq+":含有非法的字符");
}
}else{
System.out.println(qq+":不能以0开头");
}
}else{
System.out.println(qq+":长度错误");
}
}
}
正则表达式对字符串的常见操作
1.匹配
其实使用的就是String类中的matches方法;
2.切割
其实使用的就是String类中的split方法;
3.替换
其实使用的就是String类中的replaceAll()方法;
4.获取
public class RegexDdemo2 {
public static void main(String[] args) {
/*
正则表达式对字符串的常见操作
1.匹配
其实使用的就是String类中的matches方法
2.切割
其实使用的就是String类中的split方法
3.替换
其实使用的就是String类中的replaceAll()方法
4.获取
*
* */
functionDemo_4();
}
/*
* 获取
//将正则规则进行对象的封装
Pattern p=Pattern.compile("a*b");
//通过正则对象的matcher方法和字符串相关联,获取要对字符串操作的匹配对象Matcher
Matcher m=p.matcher("aaaaab");
//通过Matcher匹配器对象的方法对字符串进行操作
boolean b=m.matches();
* */
public static void functionDemo_4() {
String str="welcome to chengdu,the hotpot is very delicious woo";
String regex="\\b[a-z]{3}\\b";
//将正则封装成对象
Pattern p=Pattern.compile(regex);
//2.通过正则对象获取匹配器对象
Matcher m=p.matcher(str);
//使用Matcher对象的方法对字符串进行操作
//既然要获取三个字母组成的单词
//查找 find();
while(m.find()){
System.out.println(m.group());//获取匹配的子序列
System.out.println(m.start()+":"+m.end());
}
}
/*
* 替换
* */
public static void functionDemo_3() {
String str="zhangsantttttxiaoqiangmmmmmzhaoliu";
str=str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
String tel="15800001111";//158****1111
tel=tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println(tel);
}
/*
* 切割
*
* 组: ((A)(B(C))) 第一组:((A)(B(C))) 第二组\A 第三组(B(C))第四组(C)
* 组零始终代表整个表达式
*
* 捕获组可以通过计算从左到右计算器开括号来编号。
* */
public static void functionDemo_2() {
String str="zhangsan xiaoqiang zhaoliu";
String str1="zhangsan.xiaoqiang.zhaoliu";
String str2="zhangsantttttxiaoqiangmmmmmzhaoliu";
String[] names=str.split(" +");//空格出现一次或者多次
String[] names1=str1.split("\\.");
String[] names2=str2.split("(.)\\1+");//任意字符出现多次作为分隔符,组的应用
for(String name2:names2){
System.out.println(name2);
}
}
/*
* 演示匹配
* */
public static void functionDemo_1(){
// 匹配手机号码是否正确
String tel="15800001111";
String regex="1[358]\\d{9}";//1[358][0-9]{9}
boolean b=tel.matches(regex);
System.out.println(tel+":"+b);
}
}
注意:
1.Java的正则表达式是由java.util.regex的Pattern和Matcher类实现的。Pattern对象表示经编译的正则表达式。静态的compile( )方法负责将表示正则表达式的字符串编译成Pattern对象。只要给Pattern的matcher( )方法送一个字符串就能获取一个Matcher对象。
2.在正则表达式中“.”代表任何一个字符,因此在正则表达式中如果想要使用普通意义的点字符“.”,必须使用转义字符“\”。
3.组(Group)是指里用括号括起来的,能被后面的表达式调用的正则表达式。
正则表达式的应用
public class RegexTest {
public static void main(String[] args) {
/*
1. 治疗口吃:我我...我我...我我我要...要要要要...要要要要...学学学学学学...学学...编编编...编...程程程...程程。
2. 对ip地址排序。
3. 对邮件地址校验。
*/
test_3();
}
//治疗口吃
public static void test_1(){
String str="我我...我我...我我我要...要要要要...要要要要...学学学学学学...学学...编编编...编...程程程...程程。";
//将字符串中的“.”去掉,用替代。
str=str.replaceAll("\\.+", "");
// System.out.println(str);
//替换叠词
str=str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
/*
ip地址排序
(4)192.168.10.34 (3)127.0.0.1 (1)3.3.3.3 (2)105.7.11.55
*/
public static void test_2(){
String ip_str="192.168.10.34 127.0.0.1 3.3.3.3 105.7.11.55";
//为了让ip可以按照字符串顺序进行比较,只要让ip的每一段的位数相同。
//所以,补零,按照每一位所需最多0进行补充。每一段都加两个0
ip_str=ip_str.replaceAll("(\\d+)", "00$1");
//每一段保留数字3位
ip_str=ip_str.replaceAll("0*(\\d{3})", "$1");
System.out.println(ip_str);
//将ip地址切出
String[] ips=ip_str.split(" +");
TreeSet<String> ts=new TreeSet<String>();
for(String ip:ips)
ts.add(ip);
for(String ip:ts)
System.out.println(ip.replaceAll("0*(\\d+)", "$1"));
}
//对邮件地址校验
public static void test_3(){
String mail="abc1@sina.com.cn";
String regex="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";
regex="\\w+@\\w+(\\.\\w+)+";
boolean b=mail.matches(regex);
System.out.println(mail+":"+b);
}
}
网页爬虫
/*
网页爬虫:其实就是一个程序用于在互联网中获取符合指定规则的数据。
爬取邮箱地址。
*/
public class RegexTest2 {
public static void main(String[] args) throws IOException {
List<String> list=getMailsByWeb();
for(String mail:list){
System.out.println(mail);
}
}
public static List<String> getMailsByWeb() throws IOException {
//1. 读取源文件
// BufferedReader bufr=new BufferedReader(new FileReader("c:\\mail.html"));
URL url=new URL("https://www.douban.com/group/blabla/");
BufferedReader bufIn=new BufferedReader(new InputStreamReader(url.openStream()));
//2. 对读取的数据进行规则的匹配。从中获取符合规则的数据。
String mail_regex="\\w+@\\w+(\\.\\w+)+";
List<String> list=new ArrayList<String>();
Pattern p=Pattern.compile(mail_regex);
String line=null;
while((line=bufIn.readLine())!=null){
Matcher m=p.matcher(line);
while(m.find()){
//3. 将符合规则的数据存储到集合中。
list.add(m.group());
}
}
return list;
}
public static List<String> getMails() throws IOException{
//1. 读取源文件
BufferedReader bufr=new BufferedReader(new FileReader("c:\\mail.html"));
//2. 对读取的数据进行规则的匹配。从中获取符合规则的数据。
String mail_regex="\\w+@\\w+(\\.\\w+)+";
List<String> list=new ArrayList<String>();
Pattern p=Pattern.compile(mail_regex);
String line=null;
while((line=bufr.readLine())!=null){
Matcher m=p.matcher(line);
while(m.find()){
//3. 将符合规则的数据存储到集合中。
list.add(m.group());
}
}
return list;
}
}