java學習——《Regex》,java《Regex》
Regex
一、有這麼一個需求,判斷一個qq號是否合法?它的長度只能在5-15位,並且只能是數字,0不能開頭,使用條件陳述式做判斷,可以這麼做
/* * 需求:校正qq號 * 要求:長度5-15;只能是數字;0不能開頭 */ public static void checkQQ(String qq){ int length=qq.length(); if(length>=5&&length<=15){ if (!qq.startsWith("0")) { try { Long l=Long.parseLong(qq); System.out.println("正確!"); } catch (NumberFormatException e) { System.out.println(qq+":不是數字錯誤!"); } }else { System.out.println(qq+":0開頭錯誤!"); } }else { System.out.println(qq+":長度錯誤!"); } }View Code
在Regex面前,它顯然有些麻煩,但是它還是有優點就是易讀,很容易看懂代碼意思。
使用Regex,代碼就變成了
public static void checkQQByRegex(String qq){ String regex="[1-9][0-9]{4,14}"; boolean b=qq.matches(regex); System.out.println(qq+":"+b); }View Code
簡單的Regex,卻不容易讀懂,因此我們需要記很多符號代表的意思。
二、一些常用需要記憶的符號
| 字元類 |
| [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](減去) |
| 預定義字元類 |
| . |
任何字元(與行結束符可能匹配也可能不匹配) |
| \d |
數字:[0-9] |
| \D |
非數字: [^0-9] |
| \s |
空白字元:[ \t\n\x0B\f\r] |
| \S |
非空白字元:[^\s] |
| \w |
單詞字元:[a-zA-Z_0-9] |
| \W |
非單詞字元:[^\w] |
| 邊界匹配器 |
| ^ |
行的開頭 |
| $ |
行的結尾 |
| \b |
單詞邊界 |
| \B |
非單詞邊界 |
| \A |
輸入的開頭 |
| \G |
上一個匹配的結尾 |
| \Z |
輸入的結尾,僅用於最後的結束符(如果有的話) |
| \z |
輸入的結尾 |
| Greedy 數量詞 |
| X? |
X,一次或一次也沒有 |
| X* |
X,零次或多次 |
| X+ |
X,一次或多次 |
| X{n} |
X,恰好 n 次 |
| X{n,} |
X,至少 n 次 |
| X{n,m} |
X,至少 n 次,但是不超過 m 次 |
三、常用功能
1、匹配:其實就是String類中matches方法
/* * 匹配功能 * 需求:校正手機號 * 要求:11位,開頭13、15、18 */ public static void fun1() { String phone="13511110000"; String regex="1[358]\\d{9}";//等同於String regex="1[358][0-9]{9}" boolean b=phone.matches(regex); System.out.println(phone+":"+b); }View Code
2、替換:其實就是String類中replaceAll方法,不是replace方法
/* * 替換功能 * 需求:將已知電話號碼,替換成形如152****0000 */ public static void fun3() { String phone="15200001111"; String newPhone=phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");//$1取前一個運算式中第一組 System.out.println(newPhone); }View Code
3、切割:其實就是String類中split方法
/* * 切割功能 * 需求:從字串疊詞部分切割 */ public static void fun2() { String s="張三@@@李四aaa王五"; String regex="(.)\\1+";//.任一字元,()組,\1取第一組,+至少出現一次 String strs[]=s.split(regex); for (String string : strs) { System.out.println(string); } }View Code
4、擷取:為了String類方便提供了上面方法,其實底層都是使用了Pattern類
/* * 擷取功能 * 需求:擷取“da jia hao,wo shi zhang san!”中三個字母組成的字串 */ public static void fun4() { String s="da jia hao,wo shi zhang san!"; String regex="\\b[a-z]{3}\\b";//單詞邊界\b Pattern p=Pattern.compile(regex);//將正則封裝成對象 Matcher m=p.matcher(s);//綁定字串擷取匹配器 //使用匹配器的find方法 while (m.find()) {//find 方法掃描輸入序列以尋找與該模式比對的下一個子序列。 System.out.println(m.group());//返回由以前匹配操作所匹配的輸入子序列。 } }View Code
四、練習
1、治口吃
/* * 需求:治口吃 */ public static void kouchi() { String s="我我我我....要要要要要要...學學..加..瓦!"; //第一步替換... String s2=s.replaceAll("\\.+", ""); //第二部替換疊詞 String s3=s2.replaceAll("(.)\\1+", "$1"); System.out.println(s3); }View Code
2、對ip地址排序
/* * 需求:對ip地址進行排序 */ public static void ipSort() { String s="192.168.0.1 127.0.0.1 133.1.1.1 88.0.192.1"; Set<String> set=new TreeSet<String>();//使用treeset排序的功能 //截取字串,放入set中,因為字元長度不同,所以排序失敗,所以需要補0 s=s.replaceAll("(\\d+)", "00$1");//00127.000.000.001 //保留3位元 s=s.replaceAll("\\d+(\\d{3})", "$1");//088.000.192.001 String strs[]=s.split(" +"); for (String string : strs) { set.add(string); } for (String str : set) { //去除0打頭和兩位0 str=str.replaceAll("0{1,2}(\\d+)", "$1"); System.out.println(str); } }View Code
3、對郵箱進行校正
/* * 郵箱地址校正 */ public static void checkMail() { String mail="zhangsan@sina.com.cn"; String regex="\\w+@\\w+(\\.\\w+)+"; boolean b=mail.matches(regex); System.out.println(mail+":"+b); }View Code
4、網頁爬蟲擷取郵箱
/* * 網頁爬蟲擷取郵箱 */ public static List<String> getMail(String addr) throws Exception { URL url=new URL(addr); BufferedReader br=new BufferedReader(new InputStreamReader(url.openStream()));//擷取輸入資料流 Pattern p=Pattern.compile("\\w+@\\w+(\\.\\w+)+");//封裝 Matcher m=null; String s=null; List<String> mails=new ArrayList<String>(); while ((s=br.readLine())!=null) { m=p.matcher(s);//綁定字串 while (m.find()) { mails.add(m.group()); } } return mails; }View Code