正则表达式
1.正则表达式的创建
预定义字符类
Greedy 数量词
案例分析:
public class RegDemo1 {
public static boolean check(String qq)
{
//验证QQ号的合法性 1、不能0开头 2、 长度 5-15位 3、 必须都是数字
boolean check = false;
//通过嵌套的if...else...语句实现
if(qq.length()>=5&&qq.length()<=15)
{
if(!qq.startsWith("0"))
{ //利用异常处理非法字符的信息,亦可将相应的字符串转化为字符数组一一进行判断
try {
long l = Long.parseLong(qq);
check = true;
} catch (NumberFormatException e) {
System.out.println("QQ中存在非法字符..");
}
}
else
System.out.println("qq账号不能以0为开头");
}
else
System.out.println("字符串长度必须为5-15位之间");
return check;
}
public static void main(String[] args) {
String qq = "123456";
System.out.println(RegDemo1.check(qq));
//利用正则表达式实现数据的验证(验证qq账号的合法性,验证邮箱账号的合法性)
//可通过正则表达式直接替换下述的内容(check方法)
//1、先定义一个正则表达式
String reg = "[1-9][0-9]{4,14}";
//2、通过match方法进行判断,看相应的字符串是否符合相应的内容
System.out.println(qq.matches(reg));
}
}
2.正则表达式的应用
案例分析:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegDemo2 {
/**
* 正则表达式 是对字符串的操作
* 1.匹配 --> 使用字符串的mathes(String reg )方法
*
* 2.切割 --> 使用String类中的split(String reg) 这个方法
*
* 3.替换 --> 使用String类中的replaceAll()方法
*
* 4.获取 --> 由于String没有提供直接的方法 获取 内容 aaaaaaab b
* Pattern p =Pattern.compile("a*b");
* Mather m=p.matcher("aaab");
* boolean b =m.matches();
*/
//1、匹配:检验手机号码的合法性
public static boolean check()
{
String tel = "18816775859";
//1、定义正则表达式,用于检验手机号码的合法性
String reg = "1[34578]d{9}";
//此处手机号码以1开头,第二个数字为34578中的一个,d需要通过反斜杠进行转义,{9}表示前面的数据可以取9个
//通过字符串的matches方法进行判断
return tel.matches(reg);
}
//2、切割:根据指定的正则表达式的规则对字符串进行切割
/**split方法切割字符串形式比较单一,没办法很好的解决一些特殊字符串以及特殊形式的切割规则的切割问题,
* 对于特殊字符串的切割可以考虑StringTokenizer类进行解决:
* StringTokenizer st = new StringTokenizer(str, "特殊字符串");
* 对于重复字符的切割,由于没办法直接确定分割字符的个数,因此考虑借助正则表达式实现
*/
public static void splitDemo()
{
String str = "34 54 12 67 89 1";
//1、定义相应的正则表达式
String reg = " +"; //由一个及以上的“ ”(空格)进行分割
//2、利用字符串的split方法实现字符串的分割,并打印相关的信息
for(String s : str.split(reg))
{
System.out.print(s+"-");
}
System.out.println();
//如果要求是对于下方字符串出现两次以上相同的字符作为切割位置(步骤类似进行设计)
String str1 = "aabcdddeffg";
// .代表任意 字符 (.)代表一个任意字符 而且是一个组
// 1 代表取前方的一组数据 +代表 1可以出现至少一次 或多次
String reg1 = "(.)1+"; // 即整个表达式是两次以上的叠词
for(String s : str1.split(reg1))
{
System.out.print(s+"-");
}
}
//3、替换:根据指定的正则表达式的规则替换字符串中的部分内容
public static String replace()
{
//叠字处理:对于连续出现两次以上的字符,将其替换为指定的内容或者是只保留一个即可
String str = "abbbccdefffgg";
String str1 = str.replaceAll("(.)1+", "@");
// String str1 = str.replaceAll("(.)1+", "$1");
return str1;
/**
//打码操作:对手机内容指定位置部分进行打码
//1、定义要进行替换的字符串
String str = "15868154584";
//2、借助字符串的replaceAll方法实现整体替换(对手机号码的第4-7位进行打码)
//对于每一组数据要用小括号()进行标识,否则无法识别
//$1 指的是取前面的第一组数据,依次类推$n指的是取前面的第n组数据
str = str.replaceAll("(d{3})(d{4})(d{4})","$1****$3" );
return str;
*/
}
//4、获取:获取指定内容的字符串
public static void getString()
{
//1、定义进行测试的数据
String str = "aaa bb c dd eee gggg ffff ada xixi lala gog";
//2、定义相应的正则表达式,筛选出在上述的字符串中出现具有三个字符的内容
// String reg = "([a-z])1{3}";//相同的数据连续出现四次,错误的分析
String reg ="b[a-z]{3}b"; //?????????? b起着什么作用?
Pattern p =Pattern.compile(reg);
Matcher m =p.matcher(str);
//遍历查询数据即可
while(m.find()) {
System.out.println(m.start()+"----"+m.group()+"-----"+m.end());
}
}
public static void main(String[] args) {
// System.out.println(RegDemo2.check());
// RegDemo2.splitDemo();
// System.out.println(RegDemo2.replace());
RegDemo2.getString();
}
}
实战练习:
import java.util.Arrays;
public class RegTest{
/**
* 1、 我.我我..我我我我...我我我..我我我我我..我我我..我要要要..要要要..要要要..
* 要要..要要.要.要要学..学学..学..学学..学学学..学学..学学..学学学编编.编编..
* 编.编编..编编.编编编.程程程.程程.程程.程.程程..程程;
* 还原为 "我要学编程"
*
* 2、 通过网路爬虫获取了一段ip地址 要求对这个ip地址排序
* String ip="10.10.10.10 192.168.1.112 192.168.3.2
* 192.168.1 111 202.111.1.1 3.3.3.3
* 128.1.1.1 193.165.14.12";
* 对上方ip地址进行排序
*
* 3、校验邮箱的合法性 正则表达式校验
*/
//1、还原:去除字符“.”、叠词删减为相应的一个
public static void f1()
{
String str = "我.我我..我我我我...我我我..我我我我我..我我我..我要要要..要要要.."
+ "要要要..要要..要要.要.要要学..学学..学..学学..学学学..学学..学学..学学学"
+ "编编.编编..编.编编..编编.编编编.程程程.程程.程程.程.程程..程程";
//.表示任意字符,要通过转义字符将其进行转化为普通的小点
str = str.replaceAll(".+", "");
str = str.replaceAll("(.)1+", "$1");
System.out.println(str);
}
//2、比较随机ip地址的大小
public static void f2() {
/**
* 排序 1.统一所有的位数,都保留三位:a)所有的数据前方都补两个0 b)从后方截取字符串保留三位即可
*/
String ip = "10.10.10.10 192.168.1.112 192.168.3.2 192.168.1.111 202.111.1.1 3.3.3.3 128.1.1.1 193.165.14.12";
// 所有的数字前方添加两个0
ip = ip.replaceAll("(d+)", "00$1");
// 截取后三位的数字
ip = ip.replaceAll("0*(d{3})", "$1");
// 按照空格切分字符串 分为单独的一个ip地址
String[] ips = ip.split(" +");
Arrays.sort(ips);
//按照原有的格式打印排序后的ip顺序
for (String ipSort : ips) {
System.out.println(ipSort.replaceAll("0*(d+)", "$1"));
}
// System.out.println(ip);
}
//3、校验邮箱的合法性
public static void f3() {
//定义存储邮箱信息的字符串
String email = "ab_cdA12345@sina.com.cn";
//定义正则表达式实现邮箱校验
String reg = "w+@[a-zA-Z0-9]+(.[a-zA-Z]{2,}){1,3}";
//通过字符串的matches方法进行匹配
boolean b = email.matches(reg);
System.out.println(b);
}
public static void main(String[] args) {
RegTest.f1();
RegTest.f2();
RegTest.f3();
}
}