1. 程式人生 > >Java學習系列(二十四)Java正則表示式詳解

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