正則表達式:符合一定規則的表達式,用特定符號來表達一些代碼。
特點:用於一些特定的符號來表示一些代碼操作,這樣可以簡化書寫
作用:專門用於操作字符串。
優點:可以簡化對字符串的複雜操作。
缺點:符號定義越多,正則表達式越長,閱讀性越差
正則表達式的構造摘要
1. 字符
\\ 反斜線字符
\t 製表符 ('\u0009')
\n 新行(換行)符 ('\u000A')
\r 回車符 ('\u000D')
2、字符類
[abc] a、b或 c(簡單類)
[^abc] 任何字符,除了 a、b或 c(否定)
[a-zA-Z] a到 z或 A 到 Z,兩頭的字母包括在內(範圍)
[a-d[m-p]] a到 d或 m 到 p:[a-dm-p](並集)
[a-z&&[def]] d、e或 f(交集)
[a-z&&[^bc]] a到 z,除了 b和 c:[ad-z](減去)
[a-z&&[^m-p]] a到 z,而非 m到 p:[a-lq-z](減去)
3、預定義字符類
. 任何字符(與行結束符可能匹配也可能不匹配)
\d 數字:[0-9]
\D 非數字: [^0-9]
\w 單詞字符:[a-zA-Z_0-9]
\W 非單詞字符:[^\w]
4、邊界匹配器
\b 單詞邊界
\B 非單詞邊界
5、Greedy數量詞
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n次
X{n,} X,至少 n次
X{n,m} X,至少 n次,但是不超過 m 次
6、組和捕獲
捕獲組可以通過從左到右計算其開括號來編號。例如,在表達式 ((A)(B(C)))中,存在四個這樣的組:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
組零始終代表整個表達式。在替換中常用$匹配組的內容。
具體操作功能:匹配、切割、替換和獲取
匹配:String matches方法。
用規則匹配整個字符串,只要有一處不符合規則,就匹配結束,返回false。
判斷一串數字是否是手機號:手機號段只有 13xxx 15xxx 18xxxx
public static void checkTel()
{
String tel = "16900001111";
String telReg = "1[358]\\d{9}";
System.out.println(tel.matches(telReg));
}
判斷字符串是否是以字母開頭其餘全是數字
public static void demo()
{
String str = "b23a23456789";
String reg = "[a-zA-Z]\\d*";
boolean b= str.matches(reg);
System.out.println(b);
}
判斷qq是否正確:qq5-15位,不能以0開頭,中間也不能有字母
public static void checkQQ()
{
String qq = "123a454";
String regex = "[1-9]\\d{4,14}";
boolean flag = qq.matches(regex);
if(flag)
System.out.println(qq+"...is ok");
else
System.out.println(qq+"... 不合法");
}
切割:String split();
多空格切割:" _+" _表示空格
.點的切割:"\."操作
\\ 切割 :"\\\\"操作
疊詞的切割:"(.)\\1+"來操作,其中(.)是通配符,\\1代表疊一次,後面的+表示疊了多次。
實例:用 \\ 切割c:\\abc\\234\\a.doc
class RegexDemo
{
public static void main(String[] args)
{
splitDemo("c:\\abc\\234\\a.doc","\\\\");
}
public static void splitDemo(String s,String t)
{
String [] arr= s.split(t);
for(String st:arr)
System.out.println(st);
}
}
替換:String replaceAll(regex,str);如果regex中有定義組,可以在第二參數中通過$符號獲取正則表達式中的已有的組。
典型的寫法 str.replaceAll("(.)\\1+","$1")
實例:
public static void test_1()
{
String str = "我我...我我...我要..要要...要要...學學學....學學...編編編...編程..程. 程程...程...程";
/*
將已有字符串變成另一個字符串。使用 替換功能。
1,可以先將 . 去掉。
2,在將多個重複的內容變成單個內容。
*/
str = str.replaceAll("\\.+","");
System.out.println(str);
str = str.replaceAll("(.)\\1+","$1");
System.out.println(str);
}
獲取:將字符串中的符合規則的子串取出。
操作步驟:
1,將正則表達式封裝成對象。 Pattern p = Pattern.compile(reg);
2,讓正則對象和要操作的字符串相關聯。 Matcher m = p.matcher(str);
3,關聯後,獲取正則匹配引擎。 while( m.find())
4,通過引擎對符合規則的子串進行操作, { m.group(); } 僞代碼
比如取出。
實例:獲取ming tian jiu yao fang jia le ,da jia。 中4個字母的單詞
import java.util.regex.*;
class RegexDemo2
{
public static void main(String[] args)
{
getDemo();
}
public static void getDemo()
{
String str = "ming tian jiu yao fang jia le ,da jia。";
System.out.println(str);
String reg = "\\b[a-z]{4}\\b";
//將規則封裝成對象。
Pattern p = Pattern.compile(reg);
//讓正則對象和要作用的字符串相關聯。獲取匹配器對象。
Matcher m = p.matcher(str);
while(m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"...."+m.end());//返回索引位置
}
}
}
其中group(),start(),end()所帶的參數i就是正則表達式中的子表達式索引(第幾個子表達式)
用法總結:
1.只想知道字符串對錯(判斷)用匹配
2.將字符串變爲另一個字符串 用替換
3.將字符串按規則獲取成多個子串 用分割
4.想獲取字符串中的一部分 用獲取
網頁爬蟲實例:
/*
網頁爬蟲(蜘蛛)
實際上是一個功能,用於蒐集網絡上的指定信息
需求:可用於收集郵箱等信息。
應用:如通過關鍵字搜索,實際就是使用“蜘蛛”,通過查找關鍵字獲取相關的信息
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;
import java.util.*;
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMails_1();
}
public static void getMails_1()throws Exception
{
URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");
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)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
/*
獲取指定文檔中的郵件地址。
使用獲取功能。Pattern Matcher
*/
public static void getMails()throws Exception
{
BufferedReader bufr =
new BufferedReader(new FileReader("mail.txt"));
String line = null;
String mailreg = "\\w+@\\w+(\\.\\w+)+";
Pattern p = Pattern.compile(mailreg);
while((line=bufr.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
}