點擊關注公衆號,Java乾貨及時送達
一、正則表達式簡介
1.爲什麼需要正則表達式?
-
文本的複雜處理
2.正則表達式的優勢和用途?
-
一種強大而靈活的文本處理工具; -
大部分編程語言,數據庫,文本編輯器,開發環境都支持正則表達式
3.正則表達式定義:
-
正如它的名字一樣是描述一個規則,通過這個規則可以匹配一類字符串 -
學習正則表達式很大程度上就是學習正則表達式的語法規則
二、開發中如何使用?
三、正則表達式語法
普通語法
字母,數字,漢字,下劃線,以及沒有特殊定義的標點符號,都是普通字符.
表達式中的普通字符,在匹配一個字符串的時候,匹配與之相同的一個字符
簡單的轉義字符
標準字符集合
能夠與'多種字符'匹配的表達式
注意區分大小寫,大寫是相反的意思
自定義字符集合
[ ] 方括號匹配方式,能夠匹配方括號中的任意一個字符
正則表達式的特殊符號,被包含到中括號中,則失去特殊意義,除了^和-之外
標準字符集合, 除了小數點外,如果被包含於中括號,自定義字符集合將包含該集合
比如: [\d.- +]將匹配 數字,小數點,+ ,-
量詞(Quantifier)
修飾匹配次數的特殊符號
\d{6} 重複6次 \d\d{6}重複7次 (\d\d){6}重複12次
\d{1,6} 匹配連續1~6次數字 ,從6開始匹配,貪婪模式
\d{1,6}? 匹配連續1~6次數字 ,從1開始匹配,非貪婪模式
\d{4,} 匹配連續 4個數字以上
匹配次數中的貪婪模式(匹配字符越多越好,默認)
匹配次數中的非貪婪模式(匹配字符越少越好,修飾匹配次數的特殊符號後加上一個"?"號)
字符邊界
本組標記匹配的不是字符而是位置,符號某種條件的位置-----------零寬
\b匹配這樣一個位置: 前面的字符和後面的字符不全是\w
正則表達式的匹配模式
IGNORECASE 忽略大小寫模式
匹配時忽略大小寫
默認情況下,正則表達式是要區分大小寫的
SINGLELINE 單行模式
整個文本看作一個字符串,只有一個開頭,一個結尾
使小數點"."可以匹配包含換行符(\n)在內的任意字符
MULTILINE 多行模式
每行都是一個字符串,都有開頭和結尾
在指定了MULTILINE之後,如果需要僅匹配字符串開始和結束位置,可以使用\A和\Z
選擇符和分組
反向引用(\nnn)
每一對()會分配一個編號,使用()的捕獲根據左括號的順序從1開始自動編號
通過反向引用,可以對分組已捕獲的字符串進行引用
預搜索(零寬斷言)
只進行子表達式的匹配,匹配內容不計入最終的匹配結果,是零寬度
這個位置應該符合某個條件.判斷當前位置的前後字符,是否符合指定的條件,但不匹配前後的字符.是對位置的匹配
正則表達式匹配過程中,如果子表達式匹配到的是字符內容,而非位置,並被保存到最終的匹配結果中,那麼就認爲這個子表達式是佔有字符的;如果子表達式匹配的僅僅是位置,或者匹配的內容並不保存到最終的匹配結果中,那麼就認爲這個子表達式是零寬的.佔有字符還是零寬度,是針對匹配的內容是否保存到最終的匹配結果中而言的
四、電話號碼驗證
五、電子郵件地址驗證
常用正則表達式列表
六、Java 使用正則表達式
-
相關類位於: java.util.regex包下 -
類Pattern:
正則表達式的編譯表達形式
Pattern p = Patttern.compile(r,int); //建立正則表達式,並啓動相應模式
-
類Matcher:
通過解釋Pattern對character sequence 執行匹配操作的引擎
Matcher m = p.matcher(str); //匹配str字符串
/*
* 測試正則表達式的基本用法
* */
public class Demo01 {
public static void main(String[] args) {
//在這個字符串:asfsd23323,是否符合指定的正則表達式:\w+
//表達式對象
Pattern p = Pattern.compile("\\w+");
//創建Matcher對象
Matcher m = p.matcher("asfsd&&23323");
boolean result = m.matches(); //嘗試將整個字符序列與該模式匹配
System.out.println(result);
//該方法掃描輸入的序列,查找與該模式匹配的下一個子序列
boolean result2 = m.find();
System.out.println(result2);
System.out.println(m.group());
while (m.find()) {
System.out.println(m.group()); //group(),group(0)匹配整個表達式的子字符串
System.out.println(m.group(0));
}
}
}
/*
* 測試正則表達式對象中分組的處理
* */
public class Demo02 {
public static void main(String[] args) {
//在這個字符串:asfsd23323,是否符合指定的正則表達式:\w+
//表達式對象
Pattern p = Pattern.compile("([a-z]+)([0-9]+)");
//創建Matcher對象
Matcher m = p.matcher("aa232*ssd445*sds223");
while (m.find()) {
System.out.println(m.group(0));//匹配到整個表達式的子字符串內容
System.out.println(m.group(1));//匹配到第一個表達式的內容
System.out.println(m.group(2));//匹配到第二個表達式的內容
}
}
}
/*
* 測試正則表達式對象的替換操作
* */
public class Demo03 {
public static void main(String[] args) {
//在這個字符串:asfsd23323,是否符合指定的正則表達式:\w+
//表達式對象
Pattern p = Pattern.compile("[0-9]");
//創建Matcher對象
Matcher m = p.matcher("aa232*ssd445*sds223");
//替換
String newStr =m.replaceAll("#");
System.out.println(newStr);
}
}
/*
* 測試正則表達式對象的分割字符串操作
* */
public class Demo04 {
public static void main(String[] args) {
String str = "a,b,c";
String[] arrs = str.split(",");
System.out.println(Arrays.toString(arrs));
String str2 = "a232b4334c3434";
String[] arrs2 = str2.split("\\d+");
System.out.println(Arrays.toString(arrs2));
}
}
/*
* 網絡爬蟲取鏈接
* */
public class WebSpiderTest {
/*
* 獲得urlStr對應的網頁的源碼
* */
public static String getURLContent(String urlStr,String charset) {
StringBuilder sb = new StringBuilder();
try {
URL url = new URL(urlStr);
BufferedReader reader = new BufferedReader(
new InputStreamReader(
url.openStream(),Charset.forName(charset)
)
);
String temp = "";
while ((temp = reader.readLine()) != null) {
sb.append(temp);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
public static List<String> getMatherSubstrs(String destStr, String regexStr) {
Pattern p = Pattern.compile(regexStr);
Matcher m = p.matcher(destStr);
List<String> list = new ArrayList<>();
while (m.find()) {
list.add(m.group(1));
}
return list;
}
public static void main(String[] args) {
String destStr = getURLContent("http://www.163.com/","gbk");
//Pattern p = Pattern.compile("<a[\\s\\S]+?</a>"); //取到的超鏈接的整個內容
//Pattern p = Pattern.compile("href=\"(.+?)\""); //取到的超鏈接的地址
List<String> result = getMatherSubstrs(destStr, "href=\"([\\w\\s./:]+?)\"");
for (String str:result) {
System.out.println(str);
}
}
}
最後,關注公衆號Java技術棧,在後臺回覆:面試,可以獲取我整理的 Java 系列面試題和答案,非常齊全。
原文鏈接:https://blog.csdn.net/yuyinghe0612/article/details/80559979
版權聲明:本文爲CSDN博主「yuyinghe0612」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
關注Java技術棧看更多幹貨
本文分享自微信公衆號 - Java技術棧(javastack)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。