正則表達式
一、概述。
1、概念:正則表達式是符合一定規則的表達式。
2、特點:用一些特定符號來表示一些代碼操作。這樣就簡化了書寫。所以學習正則表達式就是學習一些特殊符號的使用。
3、作用:專門操作字符串的。
4、好處:可以簡化對字符串的操作。
6、弊端:符號越多閱讀性越差。
二、正則表達式一些常見的匹配規則。
1、字符
x 字符 x
\ 反斜線字符
\t 製表符 (‘\u0009’)
\n 新行(換行)符 (‘\u000A’)
\r 回車符 (‘\u000D’)
\e 轉義符 (‘\u001B’)
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]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 單詞字符:[a-zA-Z_0-9]
\W 非單詞字符:[^\w]
4、邊界匹配器
^ 行的開頭
$ 行的結尾
\b 單詞邊界
\B 非單詞邊界
\A 輸入的開頭
\G 上一個匹配的結尾
\Z 輸入的結尾,僅用於最後的結束符(如果有的話)
\z 輸入的結尾
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)
正則表達式功能示例:匹配,切割,替換和獲取。
package 正則表達式;
import java.io.IOException;
import java.io.InputStream;
/**
*
* @author ZHANGYU
* 正則表達式:符合一定規則的表達式。
* 特點:用一些特定符號來表示一些代碼操作。這樣就簡化了書寫。
* 所以學習正則表達式就是學習一些特殊符號的使用。
* 作用:專門操作字符串的。
* 好處:可以簡化對字符串的操作
* 弊端:符號越多閱讀性越差。
* 需求:對qq號進行驗證。
* 要求:5-15位 不能0開頭 只能爲數字。
*
* 具體操作:
* 1 匹配:String matches方法。用規則匹配整個字符串,只能有一處不符合規則匹配結束,返回false
*
*/
public class test1 {
public static void main(String[] args) throws IOException{
String qq="123456789a";
Check1(qq);
check2(qq);
check3(qq);//正則檢查qq號
checkTel();//檢查手機號
splitDemo("zhang.li.wang","\\.");//按照.切割
splitDemo("zhang li wang"," +");//按照多個空格切割。
splitDemo("c:\\a\\d\\c.txt","\\\\");
splitDemo("asddsjjlkwwaao","(.)\\1");//切割疊詞。爲了讓規則結果被重用,可以將規則封裝成一個組,用()完成,組的出現都有編號
splitDemo("asddsjjjlkwwwsaao","(.)\\1+");//從1開始,想要使用已有的組可以通過,\n(n就是組編號)的形式來獲取。
String str="sd324234df54345345fgt4343fd435234";//把字符串中的數組替換爲#
replaceAllDemo(str,"\\d{5,}","#");//把連續5個或5個以上的數字有#代替
String str1="sdsddwekkl";
replaceAllDemo(str1,"(.)\\1+","#");//將疊詞替換成#
}
private static void replaceAllDemo(String str, String strRegx, String newstr) {
// TODO Auto-generated method stub
str=str.replaceAll(strRegx, newstr);
System.out.println(str);
}
private static void splitDemo(String str,String strReg) {
// TODO Auto-generated method stub
String[] s=str.split(strReg);
for(String i:s){
System.out.println(i);
}
}
/*
* 匹配:
* 手機號端有:13xxxxx 15xxxxx 18xxxxx
*/
private static void checkTel() {
// TODO Auto-generated method stub
String tel="13888882134";
String telReg="1[358]\\d{9}";
boolean flage=tel.matches(telReg);//匹配的是整個字符。
System.out.println("tel:"+ flage);
}
//判斷QQ號
private static void check3(String qq) {
// TODO Auto-generated method stub
//String regex="[1-9][0-9]{4,14}";
String regex="[1-9]\\d{4,14}";
boolean flage=qq.matches(regex);
if(flage==true)
System.out.println("qq:"+qq);
else
System.out.println("帳號異常");
}
private static void check2(String qq) {
// TODO Auto-generated method stub
if(qq.length()>=5&&qq.length()<=15){
if(!(qq.startsWith("0"))){
try{
Long l=Long.parseLong(qq);
System.out.println("帳號正確");
}catch(NumberFormatException e){
System.out.println("帳號只能爲數字");
}
}
else{
System.out.println("帳號開頭不能爲0");
}
}else
System.out.println("帳號長度不夠");
}
private static void Check1(String qq) {
// TODO Auto-generated method stub
if(qq.length()>=5&&qq.length()<=15){
if(!(qq.startsWith("0"))){
char[] ch=qq.toCharArray();
boolean flage=false;
for(int i=0;i<ch.length;i++){
if(ch[i]>='0'&&ch[i]<='9')
flage=true;
else
flage=false;
}
if(flage==true){
System.out.println("帳號正確");
}
else
System.out.println("帳號只能爲數字");
}
else{
System.out.println("帳號開頭不能爲0");
}
}else
System.out.println("帳號長度不夠");
}
}
獲取功能的示例:
package 正則表達式;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 正則表達式的功能:獲取
*
*
* 操作步驟:
* 1、將正則表達式封裝成對象。
* 2、讓正則對象和要操作的字符串相關聯。
* 3、關聯後,獲取正則匹配引擎。
* 4、通過引擎對符合規則的子串進行操作。比如:取出。
*/
public class test3 {
public static void main(String[] args){
Regx();
}
public static void Regx(){
String str="hahaha lwa kd sdi d s ds ew ssd";
String reg="\\b[a-z]{3}\\b";
//將規則封裝成對象。
Pattern p=Pattern.compile(reg);
//讓正則對象和要作用的字符串相關聯。
Matcher m=p.matcher(str);//其實String類中的matches方法,用的就是Pattern和Matcher對象來完成的
//只不過被String方法封裝後,用起來較爲簡單,但是功能比較單一。
//m.find()//將規則作用到字符串上,並進行符合規則的子串查找。
while(m.find()){
System.out.println(m.group());//用於獲取匹配後的結果。
System.out.println(m.start()+"-----"+m.end());
}
}
}
正則表達式一些小練習。
練習一:
package 正則表達式;
/*
* 需求:將下列字符串轉化爲:我要學編程。
*
* 到底用四種功能中的那一個呢?還是那幾個呢?
* 思路如下:
* 1、如果只想知道字符串是對還是錯,使用匹配。
* 2、想要用已經有的字符串變成新的字符串,替換。
* 3、想要按照自定的方式將字符串變成多個字符串。切割,獲取規則以外的子串。
* 4、想要拿到符合需求的字符串子串。獲取。獲取符合規則的子串。
*
*/
public class test4 {
public static void main(String[] args){
String str="我我...我我...我我...我我.......要要學學學....編編...編程...程程....程";
/*
* 思路:
* 將已經有的字符串變成新的字符串用--替換。
* 1、可以先把.去掉
* 2、再將多個重複的內容變成單個內容。
*
*/
str=str.replaceAll("\\.+", "");
System.out.println(str);
str=str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
}
練習二:
package 正則表達式;
import java.util.TreeSet;
public class test5 {
public static void main(String[] args){
ipSort();
emal();
}
private static void emal() {
// TODO Auto-generated method stub
/*
* 對郵箱地址進行校驗
*
*/
String str="[email protected]";
String Regx="[a-zA-Z0-9_]+@[a-zA-Z0-9_]+(\\.[a-zA-Z0-9_]+)+";//較爲精確的匹配方式
String Regx1="\\w+@\\w+(\\.\\w+)+";//相對不太精確的匹配方式
System.out.println(str.matches(Regx));
}
private static void ipSort() {
// TODO Auto-generated method stub
/*
* 192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2. 8.109.90.30
* 將ip地址進行地段順序排序。
*
* 還是按照字符串自然順序,只要讓它們每一段都是三位即可。
* 1、按照每一段需要的最多的0進行補齊,那麼每一段就會至少保證有三位
* 2、將每一段只保留三位,這樣所有的ip地址就會每一段都三位。
*/
String ip="192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2. 8.109.90.30";
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(" +");
TreeSet<String> ts=new TreeSet<String>();
for(String s:arr)
ts.add(s);
for(String s:ts)
System.out.println(s.replaceAll("0*(\\d+)", "$1"));
}
}
練習三:獲取一些郵箱地址。
package 正則表達式;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 網頁爬蟲(蜘蛛)
*/
public class test6 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
getMile();
getMile_1();
}
private static void getMile_1() throws Exception {
// TODO Auto-generated method stub
URL url=new URL("網頁地址");//封裝網頁地址
URLConnection conn=url.openConnection(); //連接服務器
BufferedReader bufr=new BufferedReader(new InputStreamReader(conn.getInputStream()));//帶緩衝區的網頁讀取流
String regx="\\w+@\\w+(\\.\\w+)+";
Pattern p=Pattern.compile(regx);//創建Pattern對象,封裝正則表達式
String line=null;
while((line=bufr.readLine())!=null){
Matcher m=p.matcher(line);
while(m.find())
System.out.println(m.group());
}
}
private static void getMile() throws Exception {
// TODO Auto-generated method stub
BufferedReader bur=new BufferedReader(new FileReader("mail.txt"));
String line=null;
String regx="\\w+@\\w+(\\.\\w+)+";
Pattern p=Pattern.compile(regx);
while((line=bur.readLine())!=null){
Matcher m=p.matcher(line);
while(m.find())
System.out.println(m.group());
}
}
}