正則表達式用於操作字符串的規則,這些規則由一些符號所組成。使用正則表達式可以進行更復雜的操作,而且這種複雜的操作要比方法短的多。
功能:
1,匹配。使用的是String類中的matches方法。
2,切割。使用的String類split方法。
3,替換。
4,查找。
1,將正則規則通過Pattern類中的static方法complie,封裝成Pattern對象,
2,通過Pattern類中matcher方法與字符串相關聯,獲取匹配器對象。
3,通過匹配器的方法來操作字符串。如:find是否找到,group取去匹配後的字符串。
其實String類中有關正則表達式的方法,底層都是先將傳入的正則規則封裝成Pattern對象。
然後通過Pattern對象獲取Matcher對象,在調用Matcher的方法完成的。
示例:
/*
獲取文件中的email地址。
思路:
1,既然要讀取是一個文件,需要使用字符流。FileReader。BufferedReader。
2,讀到一行數據,就和規則相關聯,取出這行字符串中所有的email地址。
3,將email地址進行存儲。
*/
public static void getMail()throws IOException
{
BufferedReader bufr = new BufferedReader(new FileReader("mail.txt"));
String line = null;
String mailreg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
Pattern p = Pattern.compile(mailreg);
while((line=bufr.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
/*
* 校驗郵件
*/
public static void checkMail()
{
String mail = "[email protected]";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
//reg = "\\w+@\\w+(\\.\\w+)+";//寬鬆式校驗。
boolean b = mail.matches(reg);
System.out.println("mail:"+b);
}
/*
192.168.1.253 10.10.10.10 127.0.105.1 2.2.2.2 30.30.30.30
將這些ip地址按照ip地址段的順序排序。
*/
public static void ipSort()
{
String ip = "192.168.1.253 10.10.10.10 127.0.105.1 2.2.2.2 30.30.30.30";
//最方便方式,就是按照字符串的字典順序比較。但是必須要保證每一個地址的位數是相同的。
//所以在不足三位段上補零,首先按照最大補零數進行填充。
ip = ip.replaceAll("(\\d+)","00$1");
System.out.println(ip);//補完。
//對補完0的ip,進行每段最後三位的保留
ip = ip.replaceAll("0*(\\d{3})","$1");
System.out.println(ip);//192.168.001.253 010.010.010.010 127.000.105.001 002.002.002.002 030.030.030.030
//通過空格進行切割。
String[] arr = ip.split(" ");
TreeSet<String> ts = new TreeSet<String>();
for(String s: arr)
{
ts.add(s);
}
for(String s : ts)
{
System.out.println(s.replaceAll("0*([0-9]+)","$1"));
}
}
/*
* 替換:使用指定字符串替換符合規則的字符串。
* 將疊詞多個替換成一個
*/
public static void replaceReg()
{
String str = "dfqqqghjzzkltpppyu";
String s = str.replaceAll("(.)\\1+","$1");
System.out.println(s);
}
/*
* 切割:按照指定規則字符串。
*/
public static void splitStr()
{
String str = "we.rw.er.ty";//
String reg = "\\.";//對於 . 在正則中是一個特殊字符。如果只當作普通符號來用,必須要轉義。
str = "dfqqqghjzzkltpppyu";
reg = "(.)\\1+";// 用疊詞作爲分隔符將字符串分開
String[] arr = str.split(reg);
for(String s : arr)
{
System.out.println(s);
}
}
/*
查找:獲取字符串中指定的三個單詞。
思路:
想要獲取指定單詞,使用匹配是不可以的,因爲符合要求的結果不是boolean類,而是很多單個字符串。
這時就要使用正則表達式對象。Pattern。
*/
public static void getWord()
{
String str ="da jia ming tian fang jia le ,shuang!";
String reg = "\\b[a-z]{4}\\b";
//1,將正則表達式封裝成Pattern。使用Pattern對象中 compile方法。
Pattern p = Pattern.compile(reg);
//2,將正則對象和字符串進行關聯。使用的matcher方法。該方法會返回一個匹配器對象Matcher。
Matcher m = p.matcher(str);
//3,使用匹配器對象的find方法去找是否有符合規則的內容。通過group獲取查找到的字符串。
while(m.find())
{
System.out.println(m.group());
}
}
/*
* 校驗電話。
*/
public static void checkTel()
{
String tel = "15800190000";
String telreg = "1[35]\\d{9}";
System.out.println(tel.matches(telreg));
}
/*
* 演示數量詞。
*/
public static void checkStr()
{
String str = "acccb";
String strreg1 = "ac{3}b";//true,c只能出現3次
String strreg2 = "ac*b";//true, * c出現0次或者多次都可以。
String strreg3 = "ac?b";//false, ? 表示 c出現1次或者0次。
String strreg4 = "ac+b";//true ,+ 表示 c出現1次或者多次。
System.out.println("str="+str.matches(strreg1));
System.out.println("str="+str.matches(strreg2));
System.out.println("str="+str.matches(strreg3));
System.out.println("str="+str.matches(strreg4));
}
/*
*普通方法判斷一個QQ號,要求:5~15,不可以0開頭,必須都是數字。
*/
public static void checkQQ(String qq)
{
int len = qq.length();
if(len>=5 && len<=15)
{
if(!qq.startsWith("0"))
{
try
{
long num = Long.parseLong(qq);
System.out.println(num);
}
catch (NumberFormatException e)
{
System.out.println("fifa qq");
}
}
else
System.out.println("no 0 start");
}
else
System.out.println("qq len nono");
}
/*
* 正則表達式判斷一個QQ號
*/
public static void checkQQByReg()
{
String qq = "552678";
String qqreg = "[1-9]\\d{4,14}";
boolean b = qq.matches(qqreg);
System.out.println("qq:"+b);
// Pattern p = Pattern.compile(qqreg);
// Matcher m = p.matcher(qq);
// boolean b2 = m.macthes();
}