-----Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
正则表达式:其实是用来操作字符串的一些规则。
3.1,好处:正则的出现,对字符串的复杂操作变得更为简单。
3.2,特点:将对字符串操作的代码用一些符号来表示。只要使用了指定符号,就可以调用底层的代码对字符串进行操作。符号的出现,简化了代码的书写。
3.3,弊端:符号的出现虽然简化了书写,但是却降低了阅读性。
其实更多是用正则解决字符串操作的问题。
组:用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。
只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加\\。
(aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。
具体的操作功能:
1),匹配 String matches方法,用规则匹配整个字符串,只要有一处不符合规则,就匹配结束。
2),切割:String split();
3),替换:replaceAll()
4),获取
class RegexDemo
{
public static void main(String[] args)
{
//checkQQ();
//splitDemo();
replaceAllDemo();
}
public static void replaceAllDemo()
{
String str = "klahfkkkkkassdfkaahfiwj"; //将重叠的字母转换成单个字母 kkkk-->k
str = str.replaceAll("(.)\\1+","$1");
//String str = "klahfkkkkkassdfkaahfiwj"; //将叠字转换成#号
//str = str.replaceAll("(.)\\1+","#");
//String str = "aljg4534lajf355545442oajdl1385456224ajfa"; //将字符串中的数字替换成#号
//str = str.replaceAll("\\d{1,}","#");
System.out.println(str);
}
public static void splitDemo()
{
//String str = "klahfkkkkkassdfkaaahfiwj";
//String reg = "(.)\\1+"; //按照多个叠字使用捕获组的方式来切
//String str = "klahfkkassdfkaahfiwj";
//String reg = "(.)\\1"; //按照叠字使用捕获组的方式来切
String str = "C:\\abc\\a.txt";
String reg = "\\\\"; //切文件
//String str = "zhangsan lisi wangwu";
//String reg = " +"; //按照一个或多个空格来切
//String str = "zhangsan,lisi,wangwu";
//String reg = ",";
String[] arr = str.split(reg);
System.out.println(arr.length);
for(String s : arr)
{
System.out.println(s);
}
}
public static void checkTel()
{
//13xxx 18xxx 15xxxx
String tel = "";
String regex = "1[358]\\d{9}";
boolean flag = tel.matches(regex);
}
//使用正则表达式的方法
public static void checkQQ()
{
String qq = "54263";
String regex = "[1-9][0-9]{4,14}";//表示第一位是1到9的数字,后面的数字0到9,出现4到15次
boolean flag = qq.matches(regex);
if (flag)
{
System.out.println(qq+"...is ok");
}
else
{
System.out.println("nonononono");
}
}
对QQ号码进行校验
要求:5~15位,0不能开头,只能是数字
//一般方法
//这种方式,使用了String类中的方法,进行组合完成了需求,但是代码过于复杂
public static void checkQQ_1()
{
String qq = "16d645544";
int len = qq.length();
if (len>=5 && len<=15)
{
if(!qq.startsWith("0"))
{
//通过类型转换出现异常判断,字母不能转换成长整型就报错
try
{
long l = Long.parseLong(qq);
System.out.println("qq"+l);
}
catch (NumberFormatException e)
{
System.out.println("出现非法字符。。。。。");
}
/*
判断qq中是否全部是数字
char[] arr = qq.toCharArray();
boolean flog = false;
for (int x=0; x<arr.length; x++)
{
if (arr[x]>='0' && arr[x]<='9')
{
flog = true;
}
else
{
flog = false;
break;
}
}
if (flog)
{
System.out.println("qq:"+qq);
}
else
{
System.out.println("qq输入不合法");
}
*/
}
else
{
System.out.println("qq不能以0开头");
}
}
else
{
System.out.println("qq长度错误");
}
}
}
/*
正则表达式的第四个功能;
4,获取 将字符串中的符合规则的子串取出
操作步骤:
a,将正则表达式封装成对象
b,让正则对象和要操作的字符串相关联
c,关联后,获取正则匹配引擎
d,通过引擎对符合规则的子串进行操作,比如取出
*/
import java.util.regex.*;
class RegexDemo2
{
public static void main(String[] args)
{
String str = "hai you ba tian jiu yao jin xing mian shi"; //想要获取三个字母连一块的子串
System.out.println(str);
String reg = "\\b[a-z]{3}\\b"; //字母出现三次 \\b 是边界符
//将规则封装成对象。
Pattern p = Pattern.compile(reg);
//让正则对象和要作用的字符串相关联,获取匹配器对象。
Matcher m = p.matcher(str);
//System.out.println(m.matches());
/*其实Sring 类中的matches方法,用的就是Pattern和Matcher对象来完成的。
只不过被String的方法封装后,用起来较为简单,但是功能却单一
boolean b = m.find(); //将规则作用到字符串上,并进行符号规则的子串查找
System.out.println(b);
System.out.println(m.group()); //用于获取匹配后结构
*/
//使用循环获取,相当于集合的迭代器
while (m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"..."+m.end());
}
}
}
练习:
import java.util.*;
class RegexTest
{
public static void main(String[] args)
{
//ipSort();
checkMail();
}
需求:对邮件地址进行校验
public static void checkMail()
{
String mail = "abc563@sina.com";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z])+"; //较为精确匹配
reg = "\\w+@\\w+(\\.\\w+)+";
System.out.println(mail.matches(reg));
}
/*
192.168.1.108 102.15.25.12 10.10.10.10 2.2.2.2 8.108.65.34
将ip地址进行地址顺序的排序
还按照字符串自然排序,只要让他们每一段都是3位即可
1),按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位
2),将每一段知保留3位,这样,所有的ip地址都是每一段3位
*/
public static void ipSort()
{
String ip = "192.168.1.108 102.15.25.12 10.10.10.10 2.2.2.2 8.108.65.34";
ip = ip.replaceAll("(\\d+)","00$1");
System.out.println(ip);
ip = ip.replaceAll("0*(\\d{3})","$1");
System.out.println(ip);
String[] arr = ip.split(" ");
for(String s : arr)
{
System.out.println(s);
}
System.out.println(".....................");
TreeSet<String> tr = new TreeSet<String>();
for(String s : arr)
{
tr.add(s);
}
for(String s : tr)
{
System.out.println(s.replaceAll("0*(\\d+)","$1"));
}
}
/*
将下列字符串转成:我要学编程
到底用四种功能中的哪一个呢?或者那几个呢/
思路:
1),如果只想要知道该字符串是否 对或错,使用匹配
2),想要将已有的字符串变成另一个字符串,使用替换
3),想要按照指定的方式将字符串变成多个字符串,切割,获取规则以外的子串
4),想要拿到符号需求的字符串子串,获取,获取符号规则的子串
将已字符串变成另一个字符串,使用替换功能。
1),可以先将. 去掉
2),再将多个重复的内容变成单个内容
*/
public static void test_1()
{
String str = "程程";
str = str.replaceAll("\\.+","");
System.out.println(str);
str = str.replaceAll("(.)\\1+","$1");
System.out.println(str);
}
}
/*
网页爬虫(蜘蛛) 获取网站上的邮箱
import java.io.*;
import java.util.regex.*;
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMail_2();
}
//从网页上获取邮箱地址
public static void getMail_2()throws Exception
{
URL url = new URL("http://www.baidu.com"); //获取服务端的url
URLConnection conn = url.openConnection();
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
String mailReg = "\\w+@\\w+(\\.\\w+)+"; //确定格式
Pattern p = Pattern.compile(mailReg);
while ((line = bufIn.readLine()) != null)
{
//System.out.println(line);
Matcher m = p.matcher(line); //判断是否是该模式下的邮箱
while (m.find())
{
System.out.println(m.group());
}
}
}
/*
获取指定文档中的邮件地址。
使用获取功能: Pattern Matcher
*/
public static void getMail_1()throws Exception
{
BufferedReader bufr =
new BufferedReader(new FileReader("mail.txt"));
String mailReg = "\\w+@\\w+(\\.\\w+)+"; //获取该模式下的邮箱
Pattern p = Pattern.compile(mailReg);
String line = null;
while ((line = bufr.readLine()) != null)
{
//System.out.println(line);
Matcher m = p.matcher(line); //判断是否匹配
while (m.find())
{
System.out.println(m.group());
}
}
}