標籤:java 正則
------- android培訓、java培訓、期待與您交流! ----------
Regex:符合一定規則的運算式,用特定符號來表達一些代碼。
特點:用於一些特定的符號來表示一些代碼操作,這樣可以簡化書寫
作用:專門用於操作字串。
優點:可以簡化對字串的複雜操作。
缺點:符號定義越多,Regex越長,閱讀性越差
Regex的構造摘要
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中有定義組,可以在第二參數中通過$符號擷取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,將Regex封裝成對象。 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就是Regex中的子運算式索引(第幾個子運算式)
用法總結:
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 = "\\[email protected]\\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 = "\\[email protected]\\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());
}
}
}
}
本文出自 “點點滴滴” 部落格,請務必保留此出處http://arctictern.blog.51cto.com/10120640/1660008
黑馬程式員----Java基礎:Regex