Java學習系列(二十四)Java正則表示式詳解
前言
正則表示式可以說是用來處理字串的一把利器,它是一個專門匹配n個字串的字串模板,本質是查詢和替換。在例項演示之前先了解一下Pattern、Matcher這兩個工具類,Pattern:編譯好的帶匹配的模板(如:Pattern.compile("[a-z]{2}");/ / 取2個小寫字母);Matcher:匹配目標字串後產生的結果(如:pattern.matcher("目標字串");)。字串還有一個自帶的matches方法用來判斷目標字串是否匹配給定的正則表示式,格式為:targetStr.matches(regex); 返回型別為boolean。
基本使用方式
(一)支援的基本萬用字元:
. -可以匹配任意字元
\s -代表一個任意空白(空格、Tab)。
\S -代表一個任意的非空白。
\d -代表一個任意的數字(digital)。
\D -代表一個任意的非數字。
\w -代表一個單詞字元。
-W -代表一個任意的非單詞字元
注意:對於特殊字元,實際使用時記住要轉義\ ,如:( ) [ ] { } \ ? * + ^(一行的開頭) $(一行的結尾)|
(二)取值範圍(用作出現次數的“副詞”)
? --代表它前面的東西可以出現0~1次
* --代表它前面的東西可以出現0~N次
+ --代表它前面的東西可以出現1~N次
{n,m} --代表它前面的東西可以出現n~m次
{n,} --代表它前面的東西至少出現n次
{,m} --代表它前面的東西最多出現m次
{n} --代表它前面的東西必須出現n次
(三)方括號表示式
列舉:[ab1] --代表a或b或者1。
範圍:[a-c] --代表a,b,c中的任意一個字元。
列舉與範圍:[a-c1-3]--代表a,b,c,1,2,3中的任意一個字元。
表示求否:[^a-c] --代表不含a,b,c其中任意一個字元。
表示求交:[a-g&&[^b-d]]:--代表a,e,f,g中的任意一個字元。
表示必須含有其中之一:(com|org|cn)
總結:一個字元用\,多個字元用[],字元次數用{}
例項說明
(一)基本用法演示:
/**
* 正則表示式例項演示說明
*
* @author [*昨日重現*] [email protected]
* @since version 1.0
* @datetime 2015年5月5日 下午2:27:50
*/
public class RegexTest {
public static void main(String[] args) {
// 單個字元
System.out.println("a".matches("."));
// 0~1個a
System.out.println("a".matches("a?"));
// 1~N個a
System.out.println("aaaa".matches("a+"));
// 0~N個a
System.out.println("".matches("a*"));
// 1~N個q和1個0~9之間的數字
System.out.println("qqqqqq3".matches("q+[0-9]"));
// 12~100個數字
System.out.println("12345667890123".matches("\\d{12,100}"));
// 0~3個數字分別以.分割
System.out.println("192.168.0.1"
.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));
// 第一個數字0~2,第二個數字0~9,第三個數字0~9
System.out.println("192".matches("[0-2][0-9][0-9]"));
// 4個任意空白
System.out.println(" \n\r\t".matches("\\s{4}"));
// 特殊字元\需轉義
System.out.println("\\".matches("\\\\"));
// 以h開頭,中間有0~N個字元,最後以o結尾
System.out.println("hello".matches("^.*o$"));
// 以h開頭,中間1~3個字母尾隨一個o,接著空白連著0~N個字元並以d結尾
System.out.println("hello world".matches("^h[a-z]{1,3}o\\b.*d$"));
// 以任意空白且不以換行開頭為開頭,並以換行結尾
System.out.println(" \n".matches("^[\\s&&[^\\n]]*\\n$"));
// 0~N個字元,連線4個數字和一個字元
System.out.println("aaa 2222q".matches(".*\\d{4}."));
}
}
(二)實際應用演示:
1、讀取網頁中所有的郵箱地址
/**
* 讀取某個網頁中的所有郵箱地址--基本查詢
*
* @author [*昨日重現*] [email protected]
* @since version 1.0
* @datetime 2015年5月5日 下午4:20:00
*/
public class EmailTest {
public static void main(String[] args) {
// 1~N個單詞(可能含有.、-)連線 @1~N個單詞連著 . 最後以com|org|cn|net其中之一結尾
String emailTemplate = "[\\w[.-]][email protected][\\w]+\\.(com|org|cn|net)";
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(
"d:\\email.html")));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
parse(sb.toString(), emailTemplate);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
}
/**
* 列印網頁中的所有郵箱地址
*
* @param targetStr
* 目標字串
* @param template
* 待編譯的正則模板
*/
public static void parse(String targetStr, String template) {
if (targetStr == null || template == null) {
return;
}
// 獲取編譯好的待匹配的模板
Pattern pattern = Pattern.compile(template);
// 獲取匹配目標字串後產生的結果
Matcher matcher = pattern.matcher(targetStr);
// 若查詢下一個匹配正則表示式的字串
while (matcher.find()) {
// 則取出上一次與正則表示式匹配的字串。
System.out.println("=======" + matcher.group());
}
}
}
2、程式碼行數統計:
/**
* 程式碼統計:遍歷某個專案的原始檔的程式碼行數。
*
* 包括:空白行數、程式碼行數、註釋行數。
*
* @author [*昨日重現*] [email protected]
* @since version 1.0
* @datetime 2015年5月5日 下午4:40:12
*/
public class CodeCounter {
/**
* 空白行數
*/
private static long whiteLines = 0;
/**
* 程式碼行數
*/
private static long normalLines = 0;
/**
* 註釋行數
*/
private static long commentLines = 0;
public static void main(String[] args) {
File srcDir = new File("D:\\workspace\\android\\Abc\\src");
myList(srcDir);// 遍歷所java原始檔
System.out.println("whiteLines = " + whiteLines);
System.out.println("normalLines = " + normalLines);
System.out.println("commentLines = " + commentLines);
System.out.println("totalLines = " + getTotalLines());
}
/**
* 獲取總行數
*/
private static long getTotalLines() {
long value = whiteLines + normalLines + commentLines;
return value;
}
/**
* 遍歷所java原始檔
*/
private static void myList(File srcDir) {
System.out.println(srcDir + "目錄下包含的目錄和子檔案有:");
File[] files = srcDir.listFiles();
for (File file : files) {
System.out.println("----------" + file);
if (file.getName().matches(".*\\.java$")) {
parse(file);
}
if (file.isDirectory()) {
myList(file);
}
}
}
/**
* 讀取原始檔內容
*
* @param file
* java檔案
*/
private static void parse(File file) {
BufferedReader br = null;
/**
* 標識註釋的開始或結束
*/
boolean comment = false;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(
file)));
String line = null;
while ((line = br.readLine()) != null) {
line = line.trim();
// 以任意空白且不以換行開頭為開頭,並以換行結尾
if (line.matches("^[\\s&&[^\\n]]*$")) {
whiteLines++;
} else if (line.startsWith("/*")) {
commentLines++;
comment = true;
} else if (comment == true) {
commentLines++;
if (line.endsWith("*/")) {
comment = false;
}
} else if (line.contains("//")) {
commentLines++;
} else {
normalLines++;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
br = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(三)正則表示式進階使用:
查詢子串
String s1 = "123-45678-987-11";
Pattern pattern = Pattern.compile("\\d{3,5}"); // 匹配3~5個數字
Matcher matcher = pattern.matcher(s1);
System.out.println(matcher.matches());// false
matcher.reset();// 重置匹配器,將其新增位置設定為零
System.out.println(matcher.find());// true,由於重置了匹配器此時將從起始位置查詢
System.out.println(matcher.start() + "-" + matcher.end());// 位置:0-3
// 與matches方法唯一不同的是lookingAt不需要匹配整個區域 ,它永遠是從第一個子串開始
System.out.println(matcher.lookingAt());// true
System.out.println(matcher.lookingAt());// true
查詢與替換
// CASE_INSENSITIVE:忽略子串大小寫
Pattern pattern2 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
Matcher matcher2 = pattern2
.matcher("java Java JAVA jaVA jAVA ILoveYouJaVA youhateJaVa");
// 將查詢到的所有子串進行替換 (查詢並替換)
System.out.println(matcher2.replaceAll("JAVA"));
結束語
關於Java中正則表示式的基本使用差不多就這些了,當然正則表示式的作用遠不止這些,至於更深層次的應用以後遇到了會更新上去。截止目前,JavaSE基礎差不多到這裡了,後面會更新Java效能優化、深入理解JVM、Android學習系列等,敬請期待!相關推薦
Java學習系列(二十四)Java正則表示式詳解
前言 正則表示式可以說是用來處理字串的一把利器,它是一個專門匹配n個字串的字串模板,本質是查詢和替換。在例項演示之前先了解一下Pattern、Matcher這兩個工具類,Pattern:編譯好的帶匹配的模板(如:Pattern.compile("[a-z]{2}")
Java學習筆記二十四:Java中的Object類
div equals int 父類 false info nim TE 操作 Java中的Object類 一:什麽是Object類; Object類是所有類的父類,相當於所有類的老祖宗,如果一個類沒有使用extends關鍵字明確標識繼承另外一個類,那麽這個類
Java學習系列(二十一)Java面向物件之註解詳解
一、前言 Java中的註解Annotation運用到很多方面,比如之前講的單元測試中的@Test、Spring、SpringMVC還有其他框架等等。Java本身自帶的註解也有一些,比如:@Override(子類要重寫/覆寫父類的對應方法)、@Deprecated(表
Java學習系列(二十二)Java面向物件之列舉詳解
一、前言 今天我們來講講列舉,希望通過這篇部落格大家能對列舉有個更全面的瞭解。列舉是一種例項(大寫)數固定的類(不能再建立例項),列舉改變了常量的宣告方式,而且它在編譯期間就限定了型別。列舉多用於確定的狀態數(如:滑鼠上下左右、IM訊息已讀未讀)、型別數(如:系統
Java學習筆記二十一:Java面向對象的三大特性之繼承
類構造 接下來 多重 通過 prot 圖片 等級 ++ class Java面向對象的三大特性之繼承 一:繼承的概念; 繼承是java面向對象編程技術的一塊基石,因為它允許創建分等級層次的類。 繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父
java正則表示式詳解(匹配、切割和替換)
正則表示式:符合一定規則的表示式。作用:用於專門操作字串。特點:用於一些特定的符號來表示一些程式碼操作,這樣就簡化書寫。所以學習正則表示式,就是在學習一些特殊符號的使用。好處:可以簡化對字串的複雜操作。弊端:符號定義越多,正則越長,閱讀性越差。 具體操作功能: 1,匹配:
python正則表示式詳解(二):特殊字元序列
內容提要: 說明:僅供學習交流使用 二、python正則表示式中的特殊字元序列 \number \A \Z \b \B \d \D \s \S \w \W \\ 2.1\number 以相同的序號代表的組所匹配的內容
js系列教程3-字串、正則表示式全解
全棧工程師開發手冊 (作者:欒鵬) 字串的生成轉換 你可以將任何型別的資料都轉換為字串,你可以用下面三種方法的任何一種: var num= 19;
php 中正則表示式詳解
概述 正則表示式是一種描述字串結果的語法規則,是一個特定的格式化模式,可以匹配、替換、擷取匹配的字串。常用的語言基本上都有正則表示式,如JavaScript、java等。其實,只有瞭解一種語言的正則使用,其他語言的正則使用起來,就相對簡單些。文字主要圍繞解決下面問題展開。 有哪些常用的
正則表示式詳解(貪婪與懶惰、前瞻與後顧、後向引用等)
之前嫌正則麻煩,一直沒有深入去了解過正則,能不用的地方就不使用。 最近專案中遇到了不可避免的正則使用,所以花了點時間去了解並整理了一下,理解不一定完全準確,如有不對歡迎指出,希望對大家有所幫助。 一、名詞解釋 首先我們瞭解幾個名詞:元字元 、 普通字元、列印字元、非列印字元、 限定符 、定位符、非列
正則表示式詳解及實戰
Create by jsliang on 2018-11-14 10:41:20 Recently revised in 2018-11-19 09:04:18 Hello 小夥伴們,如果覺得本文還不錯,記得給個 star,你們的 star 是我學習的動力!GitHub 地址 正則表
C語言正則表示式詳解
標準的C和C++都不支援正則表示式,但有一些函式庫可以輔助C/C++程式設計師完成這一功能,其中最著名的當數Philip Hazel的Perl-Compatible Regular Expression庫,許多Linux發行版本都帶有這個函式庫。 C語言處理正則表示式常用的函
正則表示式詳解
一、校驗數字的表示式 1 數字:^[0-9]*$ 2 n位的數字:^\d{n}$ 3 至少n位的數字:^\d{n,}$ 4 m-n位的數字:^\d{m,n}$ 5 零和非零開頭的數字:^(0|[1-9][0-9]*)$ 6 非零開頭的最多帶
正則表示式詳解/大全
正則表示式 前端往往有大量的資料效驗工作,可以通過正則表示式提高工作效率。 修飾符: i 不區分大小寫 g 全域性查詢 m 多行查詢 方法: test() 根據正則表示式規範判斷某個字串是否符合該正則規範,返回一個布林值 用法:reg.test(str
SQL---模糊查詢與正則表示式詳解和對比
1:模糊查詢 在進行資料庫查詢的時候,有完整查詢和模糊查詢之分; 完整查詢就是我們平時查詢的普通語句(對某個查詢條件確定的前提下),而模糊查詢就是常見的where 後面增加了 like 關鍵字。 一般模糊查詢語句如下: select 欄位 from 表 where 某欄位 l
js 正則表示式詳解
開篇,還是得說說 ^ 和 $ 他們是分別用來匹配字串的開始和結束,以下分別舉例說明 "^The": 開頭一定要有"The"字串; "of despair$": 結尾一定要有"of despair" 的字串; 那麼,
Linux--正則表示式--詳解
原文地址: https://www.cnblogs.com/hfutwyy/p/3415577.html 轉載請註明原文出處 一.linux文字查詢命令 在說linux正規表示式之前,還介紹下linux中查詢文字檔案常用的三個命令: 1.grep : 最早的文字
python 正則表示式 詳解
原文作者:A.M. Kuchling ([email protected]) 翻譯人員:FireHare 校對人員:Leal 適用版本:Python 1.5 及後續版本 摘要 本文是通過Python的 re 模組來使用正則表示式的一個入門教程,和庫參考手冊的對應章節相比,更為淺顯易懂、循序漸
JS中正則表示式詳解及最基本的判斷手機號,郵箱,身份證
首先最基本的符號型別及含義整理一下。 1,最基本的符號:^ $ * + ? ^ 代表字串的開始位置 &nbs
【轉載】Python正則表示式詳解
原文地址:http://blog.csdn.net/whycadi/archive/2008/01/02/2011046.aspx 1. Python 正則式的基本用法 1.1 基本規則 1.2 重複 1