2019-04-10
2019-04-18 本文已影响0人
DreamPath
正则表达式:
- 1.专门用于操作字符串的技术
- 2.而且可以简化代码,用于对字符串进行复杂操作
- 3.通过一些符号的形式,简化了代码的书写,其实底层还是代码
- 弊端:符号太多,阅读性差
正则对字符串的常见功能操作
- 1.匹配
- 2.切割
- 3.替换
- 4.获取
package rejexMatches;
import java.util.Scanner;
/**
* 1.1中括号: [判断字符位上的内容]
* 1.2预定义字符: 都带有反斜线
* . : 任意字符
* \d : 数字. [0-9]
* \D :非数字 [^0-9]
* \w : 单词字符 [a-z A-Z _0-9]
* 1.3边界字符
* ^ :行开头
* $ :行结尾
* \b : 单词边界
* 1.4: 数量词:必须结合内容
* x? : x内容出现零次或一次
* x* : x内容出现零次或多次
* x+ : x内容出现一次或多次
* x{n} :x内容出现n次
* x{n,} : x内容至少出现n次
* x{n,m} : x内容出现n到m次
*/
public class Matches_demo {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
while (true) {
System.out.println("请输入您的QQ号:");
String str = scan.nextLine();
boolean b = str.matches("\\.+");
if (b) {
System.out.println(str+": 输入的QQ号合法");
break;
}else
System.out.println(str + ": 输入的QQ号不和法,请重新输入");
}
}
}
后三种操作
package split_demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SplitDemoString {
public static void main(String[] args) {
String str = "huiehf....sud###suidh..frdgggg.gt.fdd.kkkuhgu..yfdgdtf";
/*
1.匹配(略)
*/
/*
2.切割
*/
splitss(str);
/*
3.替换
*/
replaceString(str);
/*
4.获取
*/
/**
* Pattern对象的使用原理
* 1.将正则表达式字符串编译成正则对象
* 2.通过Pattern对象获取Matcher对象(匹配器对象)
* 3.通过匹配器对象对字符串进行规划的匹配,结果都在匹配器当中
* 4.通过匹配器对象的功能获取结果.
*/
gets(str);
}
private static void gets(String str) {
String sts = "di.shu.hi hd.hdd,iu ,gfu";
String regex = "\\b[a-zA-Z]{3}\\b";
//获取正则表达式对象
Pattern pt = Pattern.compile(regex);
//通过正则表达式对象获取适配器
Matcher ms = pt.matcher(sts);
//貌似像一个迭代器 这里是一个匹配器,如果找到匹配的就输出,不能找到就继续找下一个,直到结束索引退出循环
while (ms.find()) {
System.out.println(ms.start() + "----" + ms.group() + "----" + ms.end());
System.out.println(sts.substring(ms.start(), ms.end()));
}
}
private static void replaceString(String str) {
// String replace = str.replaceAll("(.)\\1+","&&");
//在参数列表中,其他参数使用之前的参数中规则的组,需要使用&组编号
//将多个重叠的字符浓缩为一个字符
// String replace = str.replaceAll("(.)\\1+","$1");
//电话号码的隐藏,为了保证公布信息的正确性但是又维护个人信息的私密性,也就是防止被人打骚扰电话.
/* String ss="18569146418";
String replace = ss.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
System.out.println(replace);
*/
String ssy = "aiuuf99900nsnudh8978789ynsudhy089897sd";
//邮件网站过滤 只要出现5个以上的数字直接干掉为*** 为了刻意去公布 使用了中国文字,将无法过滤信息
ssy = ssy.replaceAll("\\d{5,}", "***");//比如: 衣二三四巴九零齐齐
System.out.println(ssy);
}
private static void splitss(String str) {
/* String[] strings = str.split("\\.+");
for (String ss:strings) {
System.out.println(ss);
}*/
/* 正则规则的复用,想复用,先封装,正则封装用()完成
封装完成后有编号,从1开始,规则中被()封装的称之为组,直接通过编号就可以调用对应的组
调用方式直接写已有的组的编号加上\\
如 : ()\\1.在使用已有的第一组内容,原则:先有组,才可以使用对应的编号调用组.*/
String[] strings = str.split("(.)\\1+");
for (String ss : strings) {
System.out.println(ss);
}
}
}
案例二
"23.11.10.5 192.168.1.103 3.3.3.3 10.10.10.10"
要求:将这些ip地址进行排序
package example_1;
import java.util.Arrays;
/**
* 思路:
* 1.将ip通过空格切割
* 2.对ip进行排序Arrays.sort(),通过字符串字典顺序进行排序,这个顺序,这个顺序是错误的
* 原因: 每个ip有四块,每一段最多有三位,每一位不超过255
* 应该按照位数来比较才对
* 因此我们需要将非三位的数字转换成三位.
* <p>
* 措施:将每个字段都添加两个0,再取后面三位,比较后,打印时再去掉前面的零.
*/
public class Ip_demo {
public static void main(String[] args) {
String str = "23.11.10.5 192.168.1.103 3.3.3.3 10.10.10.10";
//首先需要在每个字段前面添上两个零
str = str.replaceAll("(\\d+)", "00$1");
//获取最后每个字段后三位
str = str.replaceAll("0*(\\d{3})", "$1");
//使用.进行切割成字符串数组
String[] ips = str.split(" +");
//将每个字符串进行升序排列
Arrays.sort(ips);
//循环遍历,并在遍历的同时将每个字段前面的零去掉
for (String ss : ips) {
System.out.println(ss.replaceAll("0*(\\d+)", "$1"));
}
}
}
案例三:邮件校验功能
使用正则中的匹配功能
package example_1;
public class ItCast_mail {
public static void main(String[] args) {
/**
* 邮件校驗
* 使用正则表达式中的匹配
*/
String mail = "itcast@2019itcast.cn";
String mails = "422399419@qq.com";
//比较笼统的校验规则
String regex = "\\w+@\\w+(\\.\\w+)+";
//稍微完整的校验规则
String regex1 = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]{2,3}){1,3}";
boolean b = mail.matches(regex);
boolean b1 = mails.matches(regex1);
System.out.println(mail + "---------" + b);
System.out.println(mails + "---------" + b1);
}
}
基于本地网页文件邮箱地址获取
package java_WangYePaChong;
import java.io.*;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JiYuFile {
public static void main(String[] args) throws IOException {
//创建文件源头
File file = new File("D:\\Java代码\\Java进阶1\\regular01\\src\\java_WangYePaChong\\temple\\hello.html");
//创建正则表达式源头
String regex = "\\w+@\\w+(\\.\\w+)+";
//返回邮箱地址集合 可存储到数据库中
Set<String> set = fileInMail(file, regex);
//循环遍历 后期可以存储到数据库中
for (String ss : set) {
System.out.println(ss);
}
}
//基于文件源爬起取
private static Set<String> fileInMail(File file, String regex) throws IOException {
//创建存储邮箱地址的集合对象
Set<String> set = new HashSet<>();
//创建正则表达式对象,并将规则传入
Pattern p = Pattern.compile(regex);
//获取字符读取流对象
BufferedReader buf = new BufferedReader(new FileReader(file));
String line;
//循环读取操作
while ((line = buf.readLine()) != null) {
//使用正则对象创建匹配器对象
Matcher m = p.matcher(line);
//如果找到符合regex的,便将符合的字符串存入到集合中
while (m.find()) {
set.add(m.group());
}
}
//返回集合
return set;
}
}
获取外网的html中的邮箱地址
package java_WangYePaChong;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Connection;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class UrlWangYeHtml {
public static void main(String[] args) throws IOException {
String str_url = "http://www.downxia.com/zixun/48009.html";
String regex = "\\w+@\\w+(\\.\\w+)+";
//创建url对象
URL url = new URL(str_url);
//创建基于网页爬虫方法
Set<String> set = getMail(url, regex);
for (String ss : set) {
System.out.println(ss);
}
}
private static Set<String> getMail(URL url, String regex) throws IOException {
URLConnection con = url.openConnection();
Pattern p = Pattern.compile(regex);
Set<String> set = new HashSet<>();
BufferedReader buf = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
//循环读取操作
while ((line = buf.readLine()) != null) {
//使用正则对象创建匹配器对象
Matcher m = p.matcher(line);
//如果找到符合regex的,便将符合的字符串存入到集合中
while (m.find()) {
set.add(m.group());
}
}
buf.close();
return set;
}
}