--------------ASP.Net+Android+IOS开发 . .Net培训.-----期待与您交流! --------
1. 正则表达式的概述和作用。
概述:正则表达式就是专门操作的字符串的,
优点:可以减少代码。简化书写
特点:就是用些特殊的字符来表示代码,更简便。
缺点:对于复杂的正则表达式,阅读性比较差。
2. 匹配—正则表示式
1. 方法
利用的是String类中的matchs(String regx).
2. QQ号码验证
public class QQ {
public static void main(String[]args) {
/**
* 要求:第一位不能0,长度为5-15位
*/
Stringqq = "770700715";// qq号码
StringqqRegx = "[1-9]\\d{4,14}";// 正则表达式的判定字符串
if (qq.matches(qqRegx))
System.out.println("qq:" + qq + "是正确的!");
else
System.out.println("qq:" + qq + "是错误的!");
}
}
3. 邮箱验证
public class Email {
public static void main(String[] args) {
/**
* 要求:必须有@符号,有.符号
* @符号前面可以是大小写,数字和下划线 (长度3-10)位
* @符号和.之间可以是大小写和数字。(长度2-3)为最后是以com结尾
*
*/
String emali = "770700715@126.com";
String emailRegx = "\\w{3,10}@[a-zA-Z0-9]{2,3}\\.com";
if (emali.matches(emailRegx))
System.out.println("邮箱正确");
else
System.out.println("邮箱错误");
}
}
注意点:对于\w表示的是【a-zA-Z_0-9】,因为\会被转义的,所以必须要写成\\w
同理,在字符串中要是有点(.)的话,那么要写成(\\.)
4. 中文名字验证
public class Name {
public static void main(String[] args) {
/**
* 要求:名字是汉字的话,那么是2-3个汉字
* 名字要是字符的话,那么就是6-12位
*/
String nameRegx="([\u4E00-\u9FA5]{2,3})||([A-Za-z]{6,12})";
String name="李四";
if(name.matches(nameRegx))
System.out.println("名字正确");
else
System.out.println("名字不正确");
}
}
3. 分割—正则表达式
1. 分割含有转义符号的字符串
public class Spit {
public static void main(String[] args) {
/**
* C:\a\b\123.txt 将前面的路径按照 \ 分割
* 因为要把其分装到字符串("C:\a\b\123.txt")中,\a会把其转义,所以必须这样写"C:\\a\\b\\123.txt"
* 因为还要按照\分割出来也要把分割规则封装成字符串,所以要使用"\\"
* 因为"C:\\a\\b\\123.txt"中都是两个\\所以要增加一个双\\,即"\\"
*/
spitString("C:\\a\\b\\123.txt","\\\\");
}
public static void spitString(String str,String regex){
String [] ss=str.split(regex);
for(String n: ss)
System.out.println(n);
}
}
2. 利用组来分割
组:就是把分割规则的结果还重复使用,使用()进行划分,那么就使用组,例如叠词。组还分号,从1开始分组,记忆小技巧:有几个括号就分为几个组,从左边开始数左括号,第一个左括号就是第一组,以此类推.
public class Spit {
public static void main(String[] args) {
/*
* 按照叠词进行分割,那么就是使用组
* 在正则表达式中。 .表示任意字符,(.)\1表示第二个位置的和第一个位置的相同,\1
* 因为要封装到字符串中,\1会呗转义,所以要"(.)\\1"
* 要是是多个相同的话,那么就"(.)\\1+"
*/
spitString("1235ddd56ssd11de","(.)\\1+");
}
public static void spitString(String str,String regex){
String [] ss=str.split(regex);
for(String n: ss)
System.out.println(n);
}
}
3.转义和组的结构图
4. 获取—正则表示式
步骤:
1. 将正则表达式封装成对象。
2. 将正则表达式和匹配的字符串关联起来
3. 获取字符串的匹配器
4. 通过匹配器引擎对字符串进行操作,例如:获取
注意:其实String类中的替换,匹配都是Pattern和Matcher综合运用,最后被String类封装了,操作就简单了,但是String类中还有没有在Matcher类中没有封装的方法,例如:获取。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class find {
public static void main(String[] args) {
String str="123 56254855 452 1 56 458";//字符串
String regex="\\b\\d{3}\\b";//表示连续三个数字
// \\d{3}匹配规则 \b表示的单词边界
/*将正则表达式封装成对象*/
Pattern pat=Pattern.compile(regex);
/*将正则表达式和字符串关联起来,获得匹配器*/
Matcher matcher= pat.matcher(str);
while(matcher.find()){//开始匹配
System.out.println(matcher.group());//获取匹配的内容
}
}
}
注意:在获取的时候,必须先去匹配,然后再去获取,匹配的时候,要注意匹配索引的变化。(start()和 end())
5. 替代—正则表达式
public class Replay {
public static void main(String[] args) {
/**
* 将字符串中连续两个以上的数字替换成成#号
*/
replayDemo("123ddd6ddf41y2y1d","\\d{2,}","#");
/**
* 将字符串中的叠词用一个字符来替换,就用到了组,其中$1表示的是组中的第一组
*/
replayDemo("a1113dfgkkksppd","(.)\\1+","$1");
}
public static void replayDemo(String str,String regex,String s){
str=str.replaceAll(regex,s);
System.out.println(str);
}
}
6. 网页爬虫—正则表达式
就是读取 文件的内容或者是一个网上的网页内容,从其中找出你想要的内容,例如:邮箱地址,下面就是介绍获取邮箱的地址。
步骤:
1. 获取读取文件的流,
2. 获取正则表达式的匹配器
3. 然后开始读取文件,一行一行的读取,在循环读取的时候,每一行都要与匹配器匹配
4. 然后把匹配的内容读取出来后,写入到另一个文件中。
5. 最后关闭流。
读取文件的--爬虫
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FindEmail {
public static void main(String[] args) throws Exception {
File file=new File("F:\\mail.txt");
BufferedReader buf=new BufferedReader(new FileReader(file));//读文件流
String regex="\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
Pattern p=Pattern.compile(regex);
BufferedWriter writer=new BufferedWriter(new FileWriter("F:\\newMail.txt"));//写文件流
String line=null;
while((line=buf.readLine())!=null){//读取文件
Matcher matcher=p.matcher(line);
while(matcher.find()){//匹配
/*将获取的邮箱名写到另一个文件中*/
writer.write(matcher.group());//获取
writer.newLine();//换行
writer.flush();//刷新
}
}
writer.close();
buf.close();
}
}
读取网上网页的上的邮箱地址--爬虫
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
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 FindEmaliByWangye {
public static void main(String[] args) throws IOException {
URL url = new URL("http://localhost:8088/android/index.jsp");
URLConnection conn = url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn
.getInputStream()));
String regex = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
Pattern p = Pattern.compile(regex);
String line = null;
while ((line = reader.readLine()) != null) {// 读取文件
Matcher matcher = p.matcher(line);
while (matcher.find()) {// 匹配
System.out.println(matcher.group());
}
}
reader.close();
}
}
7. 练习---正则表达式
public class regexText {
public static void main(String[] args) {
/*将此字符串变成我要学编程*/
String str = "我我我....我我我....我我我....要要要......要要要......要要要......学...学学学学...编编....程程...";
str=str.replaceAll("\\.+", "");
str=str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
}
结果:我要学编程
---------------------- ASP.Net+Android+IOS开发 . .Net培训.-----------期待与您交流! -------------------