java基礎---正則表示式
/*
正則表示式:正則表示式其實就是用於操作字串的一個規則,正則表示式的規則使用了特殊符號來表示的
需求:校驗一個QQ號。
1.不能以0開頭。
2.長度5~11
3.只能由數字組成
*/
public class Demo1 {
public static void main(String[] args) {
String qq = "ab567";
/*
if(!qq.startsWith("0")){
if(qq.length()>=5&&qq.length()<=11){
Long.parseLong(qq);
System.out.println("恭喜你,你得到了一個合法QQ");
}catch(Exception e){
System.out.println("非法QQ,QQ號只能由數字組成");
}
}else{
System.out.println("非法QQ,QQ號的長度只能是5~11位");
}
}else{
//以0開頭
System.out.println("非法QQ。QQ號不能以0開頭");
}
*/
System.out.println(qq.matches("[1-9]\\d{4,10}")?"合法QQ":"合法QQ");
}
package cn.itcast.regex;
/*
預定義字元類
. 任何字元(與行結束符可能匹配也可能不匹配)
\d 數字:[0-9]
\D 非數字: [^0-9]
\s 空白字元:[ \t\n\x0B\f\r]
\S 非空白字元:[^\s]
\w 單詞字元:[a-zA-Z_0-9]
\W 非單詞字元:[^\w]
注意:任何預定於字元沒有加上數量詞之前都只能匹配一個字元而已。
數量詞:
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n}
X{n,} X,至少n次
X{n,m} X,至少n次,但是不超過m次
範圍表示
[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](減去)
注意:範圍詞裡面不管內容有多長,沒有數量詞的配合都只能匹配一個字元而已
*/
public class Demo2 {
public static void main(String[] args) {
/*
* 預定義字元類
System.out.println("任意字元:"+"%".matches("."));
System.out.println("數字字元:"+"1".matches("\\d"));
System.out.println("任意字元:"+"A".matches("\\D"));
System.out.println("空白字元:"+"\r".matches("\\s"));
System.out.println("非空白字元:"+"\n".matches("\\S"));
System.out.println("單詞字元:"+"_".matches("\\w"));
System.out.println("非單詞字元:"+"%".matches("\\W"));
數量詞
System.out.println("?一次或一次也沒有:"+"1".matches("\\d?"));
System.out.println("* 零次次或多次也沒有:"+"123".matches("\\d*"));
System.out.println("+至少出現一次:"+"1".matches("\\d+"));
System.out.println("{n}恰好出現n次:"+"12345678912".matches("\\d{11}"));
System.out.println("{n,}至少要出現n次:"+"1234567891245".matches("\\d{11,}"));
System.out.println("{n,m}指定出現次數的範圍:"+"12345678912".matches("\\d{11,14}"));
範圍詞
*/
System.out.println("d".matches("[abc]"));
System.out.println("@".matches("[^abc]"));
System.out.println("字元可以出現在a-z之間:"+"d".matches("[a-z0-9]"));
System.out.println("d".matches("[abc]"));
}
}
package cn.itcast.regex;
import java.util.Arrays;
/*
正則表示式主要是用於字串操作的規則,正則表示式對字串的操作注意有一下幾種應用:
匹配 match()
切割(split):
替換replaceAll(String regex,String replacement):
查詢:
*/
public class Demo3 {
public static void main(String[] args) {
//matchesPhone("13556082481");
//matchesTel("020-38325152");
//testPlit1();
//testPlit2();
//replaceTest1();
replaceTest2();
}
//需求:編寫一個正則表示式匹配手機號,第一位只能是1開頭,第二位 :3,5,7,8 長度11位
public static void matchesPhone(String phone){
System.out.println(phone.matches("1[34578]\\d{9}")?"合法手機號":"非法手機號");
}
//需求2:匹配固定電話 區號-主機 區號:首位是0 長度:3-4 主機號:首位不能是0,長度7~8
public static void matchesTel(String tel){
System.out.println(tel.matches("0\\d{2,3}-[1-9]\\d{6,7}")?"合法電話號碼":"非法電話號碼");
}
//按照空格切割
public static void testPlit1(){
String str = "明 天 放 假";
String[] datas = str.split(" +");
System.out.println("陣列的元素:"+Arrays.toString(datas));
}
//根據重疊詞進行切割
public static void testPlit2(){
String str1 = "大家家明天天玩得得得得得得得開心";//大明玩開心
String[] datas1 = str1.split("(.)\\1+");//如果正則的內容需要被複用,需要對正則的內容進行分組,()分組的目的就是為了提高正則的複用性。組號不能指定,組號是從1開始
System.out.println("陣列的元素1:"+Arrays.toString(datas1));
}
/*
(.)\\1+ ()分組:分組的目的是為了讓正則的內容被複用起來。組號是從1開始。
((A)(B(C)))
組號1:((A)(B(C)))
第二組:(A)
第三組:(B(C))
第四組(C)
\1:引用第一組所匹配到的內容。
*/
//編寫一個正則匹配一個郵箱:首字母a-zA-Z1-9 [email protected] [email protected] [email protected] [email protected]
//替換
public static void replaceTest1(){
String str2 = "如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123"
+ "如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123";
String reg = "1[34578]\\d{9}";
str2 = str2.replaceAll(reg, "******");
System.out.println("被替換的內容是"+str2);
}
public static void replaceTest2(){
String str = "我我我要要要做做做項項項專案";//還原結巴的話-------->我要做專案,把重疊詞替換成的單個單詞
str = str.replaceAll("(.)\\1+", "$1");//如果需要在replaceAll方法正則的外部引用組的內容,那麼是使用$組號
System.out.println(str);
}
}
package cn.itcast.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
查詢:
指定為字串的正則表示式必須首先被編譯為此類的例項。然後,可將得到的正則物件匹配任意字串用於建立Matcher物件,
依照正則表示式,該物件可以與任意字元序列匹配。執行匹配所涉及的所有狀態都駐留在匹配器中,所以多個匹配器可以共享同一模式。因此典型的呼叫順序是:
Pattern p = Pattern.compile("正則");
Matcher m = p.matcher("aaaaa")
boolean b = m.matches();
查詢需要使用的物件:
1.Pattern(正則物件)
2.Matcher(匹配器物件)
匹配器要使用的方法:
1.find()通知匹配器去匹配字串,查詢符合規則的字串。如果能查到的符合規則的字串,則返回true,否則返回false;
2.group()獲取符合規則的子串
注意:使用group方法的時候一定要先呼叫find方法讓匹配器去查詢符合規則的字串,否則會報錯的
*/
public class Demo4 {
public static void main(String[] args) {
//找出三個字母組成的單詞給我
String content = "da jia de jia qi wan bi liao hai kai xin ma";
String reg = "\\b[a-zA-Z]{3}\\b";
//先把要字串的正則編譯成Pattern物件
Pattern p = Pattern.compile(reg);
//使用正則物件匹配字串用於產生一個Matcher物件。
Matcher m = p.matcher(content);
/*
System.out.println("有符合規則的字串嗎?"+m.find());
System.out.println("獲取結果:"+m.group());
*/
while(m.find()){
System.out.println(m.group());
}
}
}
package cn.itcast.regex;
/*
單詞邊界匹配器
\b 單詞邊界匹配器只是代表;額單詞的開始或者是結束部分,不匹配任何的字元
*/
public class Demo5 {
public static void main(String[] args) {
System.out.println("hello world".matches("hello\\b world"));
}
}
package cn.itcast.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
網路爬蟲(網路蜘蛛)
*/
public class Demo6 {
public static void main(String[] args) {
String content = "有事沒事聯絡:[email protected] 有事沒事聯絡:[email protected] 有事沒事聯絡:[email protected] 有事沒事聯絡:[email protected] 有事沒事聯絡:[email protected] "
+"有事沒事聯絡:[email protected] 有事沒事聯絡:[email protected] 有事沒事聯絡:[email protected] " ;
String reg = "[a-zA-Z1-9]\\W{5,17}@[A-Za-z0-9]{2,}(\\.(com|cn|net)){1,2}";
//把字串的正則編譯成正則物件
Pattern p = Pattern.compile(reg);
//使用正則物件產生匹配器物件
Matcher m = p.matcher(content);
while(m.find()){
System.out.println(m.group());
}
}
}