正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作,简化书写
例如,对QQ号码进行校验,要求:5~15(0不能开头,只能是数字)
import java.util.Scanner;
public class RegexDemo_1129 {
public static void main(String[] args){
System.out.println("请输入QQ号码:");
Scanner sc = new Scanner(System.in);
String qq = sc.nextLine();
checkQQ_1(qq);
}
public static void checkQQ_1(String str){
String regex="[1-9][0-9]{4,14}";
boolean flag=str.matches(regex);
if(flag)
System.out.println("qq:"+str);
else
System.out.println("不合法");
}
public static void checkQQ(String str){
int len=str.length();
if(len>=5&&len<=15){//超出int范围
if(!str.startsWith("0")){
try {
long l=Long.parseLong(str);
System.out.println("qq:"+l);
}catch (NumberFormatException e){
System.out.println("出现非法字符");
}
/*
char[] chs = str.toCharArray();
boolean flag=true;
for(int i=0;i<chs.length;i++){
if(!(chs[i]>='0'&&chs[i]<='9')) {
flag = false;
break;
}
}
if(flag){
System.out.println("qq:"+str);
}else {
System.out.println("出现非法字符");
}
*/
}else {
System.out.println("不可以0开头");
}
}else {
System.out.println("长度错误");
}
}
}
具体操作功能:
1,匹配:String matches方法
需求:手机号段只有13xxx 15xxx 18xxx
public static void checkTel(String str){
String telReg = "1[358]\\d{9}";
System.out.println(str.matches(telReg));
}
2、切割 String split();
String reg="+" //按照多个空格进行切割
例如:String str="c:\\abc\\a.txt"; reg="\\\\" c: abc a.txt
String str="erkktyqquio"; //叠词,为了可以让规则的结果被重用,可以让规则封装成一个组,用()完成,组的出现都有编号,从1开始, reg="(.)\\1" reg="(.)\\1+"(多个
弊端:符号定义越多,正则越长,阅读性越差。
3、替换
例如:将字符串的数字替换成#, replaceAll(str,"\\d{5,}","#")
将叠词替换成&, replaceAll(str,"(.)\\1+","&")
将重叠的字符替换成单个字母 replaceAll(str,"(.)\\1+","$1")
4、获取:将字符串中的符合规则的子串取出。
操作步骤:
1,将正则表达式封装成对象
2,让正则对象和要操作的字符串相关联
3,关联后,获取正则表达式引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。
练习1:
String str="我我...我我...我要..要要...学学学..编编编..程程";
//
1.先去.
2.重复变单个
//
str=str.replaceAll("\\.+","");
System.out.println(str);
str=str.replaceAll("(.)\\1+","$1");
System.out.println(str);
练习2:IP地址排序
public static void ipSort(){
String ip="192.68.1.254 102.46.23.45 2.2.2.2";
ip=ip.replaceAll("(\\d+)","00$1");
System.out.println(ip);
ip=ip.replaceAll("0*(\\d{3})","$1");
System.out.println(ip);
String[] str=ip.split(" ");
Arrays.sort(str);
for(String s:str){
System.out.println(s.replaceAll("0*(\\d+)","$1"));
}
练习3:对邮件地址进行校验
public static void checkMail(String str){
String reg="[a-zA-Z0-9_]{6,12}@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
System.out.println(str.matches(reg));
}
练习:获取邮件地址
1)网页爬虫:
public static void getMail_2()throws Exception{
URL url = new URL("");
URLConnection con = url.openConnection();
BufferedReader bufin = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line=null;
String mailReg="";
Pattern p = Pattern.compile(mailReg);
while ((line=bufin.readLine())!=null){
Matcher m = p.matcher(line);
while (m.find()){
System.out.println(m.group());
}
}
}
2)文档爬虫:
“获取”指定文档中邮件地址,
使用获取功能Pattern Matcher
public static void getMails()throws Exception {
BufferedReader bufr = new BufferedReader(new FileReader("mail.txt"));
String line=null;
String mailreg="[a-zA-Z0-9_]{6,12}@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
Pattern p =Pattern.compile(mailreg);
while ((line=bufr.readLine())!=null){
Matcher m = p.matcher(line);
while (m.find()){
System.out.println(m.group());
}
}
}