一、正則表達式概述
正則表達式是一些符號一定規則的表達式,專門用於字符串操作,它是用一些特定的符號表示一些字符串操作代碼,簡化了字符串操作代碼,但閱讀性較若。
二、一些簡單的正則表達式
1、字符類:
[abc] 該位取值只能爲abc中的一個;
[^abc] 該位取值爲除了abc以外的任意字符;
[a-zA-Z] 該位的取值爲任意的大小字母;
[a-d[m-p]] 該位的取值要麼a-d,要麼m-p;
[a-g&&[e-k]] 該位的取值爲efghijk中的任一字符;
2、預定義字符類:
. 任一字符
\d 數字[0-9];
\D 非數字[^0-9];
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符[^\s];
\w [a-zA-Z0-9_];
\W [^\w]
3、Greedy數量詞:
X? 出現一次或一次都不出現;
X* 出現零次或多次;
X+ 出現一次或多次;
X{n} 恰好出現n次;
X{n,} 至少出現n次;
X{n,m} 至少出現n次,最多出現m次。
三、基本的操作
1、匹配:用於判斷字符串是否合法(合法自己定義的)。代碼如下:
/*
1、驗證手機號是否合法,
移動:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188
聯通:130、131、132、152、155、156、185、186
電信:133、153、180、189、(1349衛通)
分析:
有上面的數字可知,手機號位數爲11位,第一位只能爲1,第二位只能爲:3/5/8,
其他的9位爲0-9。
2、驗證郵箱號是否合法,
郵箱號規則:數字或字母@數字或字母.字母/數字或字母@數字或字母.字母.字母。
*/
class MatchesTest
{
//將打印語句封裝
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
checkTel("15559889951");
checkMail("[email protected]");
}
//校驗手機號是否符合規定
public static void checkTel(String tel)
{
//定義規則
String regex = "[1][358]\\d{9}";
//校驗
boolean flag = tel.matches(regex);
//根據校驗結果輸出相應的語句
if(!flag)
sop("手機號錯誤,請重新輸入!");
else
sop("手機號碼正確!");
}
//校驗郵箱號是否符合規定
public static void checkMail(String mail)
{
//定義規則
String regex = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
//調用maches方法校驗
boolean flag = mail.matches(regex);
//根據校驗結果輸出相應的語句
if(flag)
sop("郵箱號是正確的的");
else
sop("郵箱號不符合規範,請重新輸入!");
}
}
2、替換:將一個字符串轉換成另一個字符串,將符合規則的字符串替換成指定的字符串。代碼如下:
/*
"我我...我我...我要..要要...要要...學學學...學學...編編編...編程..程.程程...程...程"
將該字符串轉換成:"我要學編程"
分析:
將一個字符串轉換成另一個字符串,應該用替換;
步驟:
1、將"."去掉;
2、將疊詞換成一個字。
其他說明:
爲了能使規則的結果可以被重用,可以將規則封裝,用"()"完成,組的出現都有編號,
從1開始,可以通過\1的方式獲取元素。一個規則中有幾組:看"(",規則的編號從左
往右數:"("。在規則內獲取:\1,在規則外獲取:$1.
*/
class ReplaceAllTest
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
String str = "我我...我我...我要..要要...要要...學學學...學學...編編編...編程..程.程程...程...程";
sop("原字符串:"+str);
//去除"."
str = str.replace(".","");
sop("去除“.”後的字符串:"+str);
//將疊詞轉換爲一個字
str = str.replaceAll("(.)\\1+","$1");
//在規則內獲取組元素:\n
//在規則外獲取族元素:$1
sop("最終的字符串:"+str);
}
}
3、切割:將字符串按照一定的規則切割成多條字符串,符合規則的丟掉。代碼如下:
/*
1、按.切割;
2、按\切割;
3、按疊詞切割。
*/
import java.util.*;
class SplitTest
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
sop("按.切割字符串-------");
split1("zhangsan.lisi.jiandan.xiaxia.jingjing.xiaoxue.xiaoxiao");
sop("按\\切割字符串-------");
split2("C:\\Users\\cecy\\Desktop\\javastudy\\javacode\\day25\\SplitTest.java");
sop("按疊詞切割字符串-------");
split3("hahaccccccheiheieeheheiiihiahiabbbbbbbxixixxxxhiehie");
}
//按.切割
public static void split1(String str)
{
//定義規則
String regex = "\\.";
//切割字符串
String[] strs = str.split(regex);
//定義一個集合,用於裝字符串對象
ArrayList<String> al = new ArrayList<String>();
//用Arrays對數組進行排序
//Arrays.sort(strs);
//將字符串取出並存入集合
for(String s : strs)
{
al.add(s);
//sop(s);
}
//用Collections的sort方法對List集合進行排序
Collections.sort(al);
//用高級for將集合輸出
for(String name : al)
{
sop(name);
}
}
//按\切割
public static void split2(String str)
{
//定義規則
String regex = "\\\\";
//切割字符串
String[] strs = str.split(regex);
//將切割結果打印
for(String path : strs)
{
sop(path);
}
}
//按疊詞切割
public static void split3(String str)
{
//定義規則
String regex = "(.)\\1+";
//切割字符串
String[] strs = str.split(regex);
//將切割結果打印
for(String s : strs)
{
sop(s);
}
}
}
4、獲取:將符合規則的字符串取出。
/*
"ming tian jiu yao fang jia le,tong xue men!"
取出上述只有三個字母組成的單詞。
*/
import java.util.regex.*;
class MatcherTest
{
public static void main(String[] args)
{
String str = "ming tian jiu yao fang jia le,tong xue men!";
//定義規則
String regex = "\\b[a-z]{3}\\b";
//將規則封裝成Pattern對象
Pattern p = Pattern.compile(regex);
//將規則對象及要操作的字符串相關聯
Matcher m = p.matcher(str);
//查找符合規則的字符串並將其取出
while(m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"---"+m.end());
}
}
}
5、練習——ip地址排序
/*
192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
將ip地址進行地址段順序的排序。
分析:簡單的排序方法有三種:1、Arrays.sort();2、存儲到TreeSet中(沒有重複元素);
3、存儲到List集合中,再用Collections中的sort()方法。
排序之前,ip地址的每段的位數要一致,不然排序出來的不符合實際。
步驟:
1、將ip地址段都轉換成3位數;
2、再將字符串切割;
3、將每個ip地址存入到TreeSet中;
4、將ip地址打印,查看是否排序正確。
規則說明:
([0-9]+):0-9的數出現一次或出現多次,並將該數封裝進組,以便調用;
0*([0-9]{3}):0出現零次或多次,0-9出現三次,並將0-9出現三次的數字封裝進組,以便再次引用。
0*([0-9]{1,3}):0出現零次或多次,0-9至少出現一次,最多出現3次,並將其封裝進組,以便再次引用。
其他說明:用到的類:TreeSet、Iterator、String
用到的方法:TreeSet(iterator、add)
Iterator(hasNext、next)
String(replaceAll、split)
*/
import java.util.*;
class IpTest
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
sop("原ip字符串:"+ip);
//在ip地址每段前加00
ip = ip.replaceAll("([0-9]+)","00$1");
sop("在每段ip地址前加00後:"+ip);
//每段ip地址保留後三位
ip = ip.replaceAll("0*([0-9]{3})","$1");
sop("保留每個ip段的後三位:"+ip);
//切割字符串,獲取ip
String[] ips = ip.split(" +");
//定義一個集合存放ip地址並對其進行排序
TreeSet<String> ts = new TreeSet<String>();
for(String i : ips)
{
ts.add(i);
}
//將ip地址取出
Iterator<String> it = ts.iterator();
while(it.hasNext())
{
sop(it.next().replaceAll("0*([0-9]{1,3})","$1"));
}
}
}
6、練習——網頁爬蟲
/*
網頁爬蟲:獲取郵箱地址。
分析:
獲取網頁文件中的郵箱號碼,先獲取網頁文件,再按照規則獲取郵箱。
步驟:
1、建立讀取流,並與文件相關聯;
2、定義規則;
3、將規則封裝成Pattern對象;
4、將規則對象和讀取的網頁文件相關聯;
5、查找符合規則的字符串並將其取出。
*/
import java.io.*;
import java.util.regex.*;
class WebCrawlerTest
{
public static void main(String[] args)
{
BufferedReader bufr = null;
try
{
//讀取網頁文件
bufr = new BufferedReader(new FileReader("C:\\Users\\cecy\\Desktop\\javastudy\\boke\\mail.txt"));
String line = null;
while((line = bufr.readLine()) != null)
{
//定義規則
String regex = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
//將規則封裝成對象
Pattern p = Pattern.compile(regex);
//將規則對象和要操作的字符串相關聯
Matcher m = p.matcher(line);
//查找符合規則的字符串並取出
while(m.find())
{
System.out.println(m.group());
}
}
}
catch (Exception e)
{
throw new RuntimeException("文件讀取失敗");
}
}
}