?? java.regex.tutorial.html
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="author" content="CSDN bao110908">
<meta name="description" content="Java Regex Tutorial translated from Java Tutorial">
<link rel="stylesheet" href="resource/style.css" type="text/css">
<script type='text/javascript' src='resource/javascript.js'></script>
<title>Java正則表達式教程</title>
</head>
<style type="text/css">
</style>
<body id="body">
<div>
<table align="center" class="text"><tr><td>
<div id="h1"> Java正則表達式教程 <a name="note_01"></a><sup><a href="#note01">[1]</a></sup><br/>
<span id="h1b">Regular Expressions of Java Tutorial</span></div>
<div id="h2"><a name="foreword"></a>譯者序</div>
正則表達式善于處理文本,對匹配、搜索和替換等操作都有意想不到的作用。正因如此,正則表達式現在是作為程序員七種基本技能之一<a name="noteStart_01"></a><sup><a href="#noteStart01"><font size="5pt">*</font></a></sup>,因此學習和使用它在工作中都能達到很高的效率。<br/>
正則表達式應用于程序設計語言中,首次是出現在 Perl 語言,這也讓 Perl 奠定了正則表達式旗手的地位?,F在,它已經深入到了所有的程序設計語言中,在程序設計語言中,正則表達式可以說是標準配置了。<br/>
Java 中從 JDK 1.4 開始增加了對正則表達式的支持,至此正則表達式成為了 Java 中的基本類庫,使用時不需要再導入第三方的類庫了。Java 正則表達式的語法來源于象征著正則表達式標準的 Perl 語言,但也不是完全相同的,具體的可以參看 Pattern 類的 API 文檔說明。<br/>
我在一次偶然中發現了位于 <a href="http://java.sun.com" target="_blank">java.sun.com</a> 站點上的 <a href="http://java.sun.com/docs/books/tutorial/" target="_blank"><cite>Java Tutorial</cite></a>,也在那里看到了關于 Java 的正則表達式教程,感覺它不同于其他的正則表達式教程,文中以大量的匹配實例來進行說明。為了能讓 Java 學習者能更好地使用正則表達式,就將其完整地譯出了。該教程中所介紹的正則表達式應用僅僅是最為簡單的(并沒有完全地涉及到 Pattern 類支持的所有正則表達式語法,也沒有涉及到高級的應用),適合于從未接觸過或者是尚未完全明白正則表達式基礎的學習者。在學習完該教程后,應該對正則表達式有了初步的了解,并能熟練地運用 java.util.regex 包中的關于正則表達式的類庫,為今后學習更高級的正則表達式技術奠定良好的基礎。<br/>
教程中所有的源代碼都在 src 目錄下,可以直接編譯運行。由于當前版本的 <a href="http://java.sun.com/docs/books/tutorial/" target="_blank"><cite>Java Tutorial</cite></a> 是基于 JDK 6.0 的,因此其中的示例程序也用到了 JDK 6.0 中的新增類庫,但正則表達式在 JDK 1.4 就已經存在了,為了方便大家使用,改寫了部分的源代碼,源代碼類名中后綴為“V4”的表示用于 JDK 1.4 或以上版本,“V5”的表示用于 JDK 5.0 或以上版本,沒有這些后綴的類在各個版本中均可以正常使用。<br/>
由于譯者的水平和技術能力有限,譯稿雖經多次校對,難免有疏漏之處,敬請大家批評和指正。若有發現不妥之處,請發送郵件至 <a href="mailto: FrankieGao123@gmail.com">FrankieGao123@gmail.com</a>,我會在 <a href="http://blog.csdn.net/bao110908" target="_blank">blog</a> 中進行勘誤,謝謝!<br/>
<p/>
火龍果頓首!<p/>
<div style="text-align: right; padding-bottom: 20px; margin-right: 24pt;">
2008 年 2 月 27 日</div><p/><p/>
<hr width="25%" align="left"><br/>
<p id="note"> <a name="noteStart01"></a><a href="#noteStart_01">*</a>
這是由《程序員》雜志社評出的,刊登在《程序員》2007 年 3 月刊上。這七種基本技能是:數組,字符串與哈希表、正則表達式、調試、兩門語言、一個開發環境、SQL 語言和編寫軟件的思想。
</p>
<div id="h2"><a name="contents"></a>目錄</div>
<div id="contents">
<ul>
<li><a href="#foreword">譯者序</a></li>
<li><a href="#preface">序</a></li>
<li><a href="#reg0">0 引言</a>
<ul>
<li><a href="#reg0_1">0.1 什么是正則表達式?</a></li>
<li><a href="#reg0_2">0.2 java.util.regex 包是如何描述正則表達式的?</a></li>
</ul>
</li>
<li><a href="#reg1">1 測試用具</a></li>
<li><a href="#reg2">2 字符串</a>
<ul>
<li><a href="#reg2_1">2.1 元字符</li>
</ul>
</li>
<li><a href="#reg3">3 字符類</a>
<ul>
<li><a href="#reg3_1">3.1 簡單類</a>
<ul>
<li><a href="#reg3_1_1">3.1.1 否定</a></li>
<li><a href="#reg3_1_2">3.1.2 范圍</a></li>
<li><a href="#reg3_1_3">3.1.3 并集</a></li>
<li><a href="#reg3_1_4">3.1.4 交集</a></li>
<li><a href="#reg3_1_5">3.1.5 差集</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#reg4">4 預定義字符類</a></li>
<li><a href="#reg5">5 量詞</a>
<ul>
<li><a href="#reg5_1">5.1 零長度匹配</a></li>
<li><a href="#reg5_2">5.2 捕獲組和字符類中的量詞</a></li>
<li><a href="#reg5_3">5.3 貪婪、勉強和侵占量詞間的不同</a></li>
</ul>
</il>
<li><a href="#reg6">6 捕獲組</a>
<ul>
<li><a href="#reg6_1">6.1 編號方式</a></li>
<li><a href="#reg6_2">6.2 反向引用</a></li>
</ul>
</li>
<li><a href="#reg7">7 邊界匹配器</a></li>
<li><a href="#reg8">8 Pattern 類的方法</a>
<ul>
<li><a href="#reg8_1">8.1 使用標志構建模式</a></li>
<li><a href="#reg8_2">8.2 內嵌標志表達式</a></li>
<li><a href="#reg8_3">8.3 使用 matches(String, CharSequence) 方法</a></li>
<li><a href="#reg8_4">8.4 使用 split(String) 方法</a></li>
<li><a href="#reg8_5">8.5 其他有用的方法</a></li>
<li><a href="#reg8_6">8.6 在 java.lang.String 中等價的 Pattern 方法</a></li>
</ul>
</li>
<li><a href="#reg9">9 Matcher 類的方法</a></li>
<ul>
<li><a href="#reg9_1">9.1 使用 start 和 end 方法</a></li>
<li><a href="#reg9_2">9.2 使用 matches 和 lookingAt 方法</a></li>
<li><a href="#reg9_3">9.3 使用 replaceFirst(String) 和 replaceAll(String) 方法</a></li>
<li><a href="#reg9_4">9.4 使用 appendReplacement(StringBuffer, String) 和 appendTail(StringBuffer) 方法</a></li>
<li><a href="#reg9_5">9.5 在 java.lang.String 中等價的 Matcher 方法</a></li>
</ul>
</li>
<li><a href="#reg10">10 PatternSyntaxException 類的方法</a></li>
<li><a href="#reg11">11 更多的資源</a></li>
<li><a href="#reg12">12 問題和練習</a></li>
<li><a href="#note">注釋</a></li>
<li><a href="#last">譯后記</a></li>
</ul></div>
<div id="h2"><a name="preface"></a>序<span class="returnContents"><a href="#contents">返回目錄</a></span></div>
本文介紹如何使用 java.util.regex API 作為正則表達式模式匹配。雖然說這個包中可被接受的語法參數與 Perl 是相似的,但我們并不需要掌握 Perl 的語法知識。本教程將從基礎開始,逐層深入到更多的高級技巧。下面是各章節的主要內容:<br/>
<div id="h4">0 引言</span></div>
粗略地看一下正則表達式,同時也介紹組成 API 的核心類。<br/>
<div id="h4">1 測試用具</span></div>
編寫了一個簡單的應用程序,用于測試正則表達式的模式匹配。<br/>
<div id="h4">2 字符串</span></div>
介紹基本的模式匹配、元字符和引用。<br/>
<div id="h4">3 字符類</span></div>
描述簡單字符類、否定、范圍、并集、交集和差集。<br/>
<div id="h4">4 預定義字符類</span></div>
描述空白字符、字母和數字字符等基本的預定義字符。<br/>
<div id="h4">5 量詞</span></div>
使用貪婪(greedy)、勉強(reluctant)和侵占(possessive)量詞,來匹配指定表達式 X 的次數。<br/>
<div id="h4">6 捕獲組</span></div>
解釋如何把多個字符作為一個單獨的單元進行處理。<br/>
<div id="h4">7 邊界匹配器</span></div>
描述行、單詞和輸入的邊界。<br/>
<div id="h4">8 Pattern 類的方法</span></div>
測試了 Pattern 中一些有用的方法,以及探究一些高級的特性,諸如:帶標記的編譯和使用內嵌標記表達式。<br/>
<div id="h4">9 Matcher 類的方法</span></div>
描述了 Matcher 類中通常使用的方法。<br/>
<div id="h4">10 PatternSyntaxException 類的方法</span></div>
描述了如何檢查一個 PatternSyntaxException 異常。<br/>
<div id="h4">11 更多的資源</span></div>
要了解更多正則表達式,可以參考這一節。<br/>
<div id="h4">12 問題和練習</span></div>
鞏固一下本教程所介紹的正則表達式的基本知識,并附有答案。<br/><br/>
為了區分文檔中的正則表達式和普通字符串,均以<code>\d[abc]{2}</code>的形式表示正則表達式的模式。<br/>
<div id="h2"><a name="reg0"></a>0 引言<span class="returnContents"><a href="#contents">返回目錄</a></span></div>
<div id="h3"><a name="reg0_1"></a>0.1 什么是正則表達式?<span class="returnContents"><a href="#contents">返回目錄</a></span></div>
<em>正則表達式</em>(regular expressions)是一種描述字符串集的方法,它是以字符串集中各字符串的共有特征為依據的。正則表達式可以用于搜索、編輯或者是操作文本和數據。它超出了 Java 程序設計語言的標準語法,因此有必要去學習特定的語法來構建正則表達式。正則表達式的變化是復雜的,一旦你理解了它們是如何被構造的話,你就能解析或者構建任意的正則表達式了。<br/>
本教程講授 java.util.regex API 所支持的正則表達式語法,以及介紹幾個可運行的例子來說明不同的對象間是如何交互的。在正則表達式的世界中,有不同風格的選擇,比如:grep<a name="note_02"></a><sup><a href="#note02">[2]</a></sup>、Perl、Tcl、Python、PHP 和 awk。java.util.regex API 中的正則表達式語法與 Perl 中的最為相似。<br/>
<div id="h3"><a name="reg0_2"></a>0.2 java.util.regex 包是如何描述正則表達式的?<span class="returnContents"><a href="#contents">返回目錄</a></span></div>
java.util.regex 包主要由三個類所組成:Pattern、Matcher 和 PatternSyntaxException。<br/>
<ul id="ulItem">
<li id="item">Pattern 對象表示一個已編譯的正則表達式。Pattern 類沒有提供公共的構造方法。要構建一個模式,首先必須調用公共的靜態 compile 方法,它將返回一個 Pattern 對象。這個方法接受正則表達式作為第一個參數。本教程的開始部分將教你必需的語法。</li>
<li id="item">Matcher 是一個靠著輸入的字符串來解析這個模式和完成匹配操作的對象。與 Pattern 相似,Matcher 也沒有定義公共的構造方法,需要通過調用 Pattern 對象的 matcher 方法來獲得一個 Matcher 對象。</li>
<li id="item">PatternSyntaxException 對象是一個未檢查異常,指示了正則表達式中的一個語法錯誤。</li>
</ul>
本教程的最后幾節課程會詳細地說明各個類。首當其沖的問題是:必須理解正則表達式是如何被構建的,因此下一節引入了一個簡單的測試用具,重復地用于探究它們的語法。
<div id="h2"><a name="reg1"></a>1 測試用具<span class="returnContents"><a href="#contents">返回目錄</a></span></div>
這節給出了一個可重用的測試用具 <a href="src/RegexTestHarness.java">RegexTestHarness.java</a>,用于探究構建 API 所支持的正則表達式。使用<br/>
<pre id="console">java RegexTestHarness</pre>
這個命令來運行,沒有被接受的命令行參數。這個應用會不停地循環執行下去<a name="note_03"></a><sup><a href="#note03">[3]</a></sup>,提示用戶輸入正則表達式和字符串。雖然說使用這個測試用具是可選的,但你會發現它用于探究下文所討論的測試用例將更為方便。
<pre name="java" id="java">import java.io.Console;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexTestHarness {
public static void main(String[] args) {
Console console = System.console();
if (console == null) {
System.err.println("No console.");
System.exit(1);
}
while (true) {
Pattern pattern = Pattern.compile(console.readLine("%nEnter your regex: "));
Matcher matcher = pattern.matcher(console.readLine("Enter input string to search: "));
boolean found = false;
while (matcher.find()) {
console.format("I found the text \"%s\" starting at index %d " +
"and ending at index %d.%n",
matcher.group(), matcher.start(), matcher.end());
found = true;
}
if (!found) {
console.format("No match found.%n");
}
}
}
}</pre>
在繼續下一節之前,確認開發環境支持必需的包,并保存和編譯這段代碼。
<div id="h4">【譯者注】</span></div>
由于當前版本的 <a href="http://java.sun.com/docs/books/tutorial/" target="_blank"><cite>Java Tutorial</cite></a> 是基于 JDK 6.0 編寫的,上述的測試用具由于使用到 JDK 6.0 中新增的類庫(java.io.Console),所以該用具只能在 JDK 6.0 的環境中編譯運行,由于 Console 訪問操作系統平臺上的控制臺,因此這個測試用具只能在操作系統的字符控制臺中運行,不能運行在 IDE 的控制臺中。<br/>
正則表達式是 JDK 1.4 所增加的類庫,為了兼容 JDK 1.4 和 JDK 5.0 的版本,重新改寫了這個測試用具,讓其能適用于不同的版本。<br/>
JDK 5.0 適用的測試用具(<a href="src/RegexTestHarnessV5.java">RegexTestHarnessV5.java</a>,該用具可以在 IDE 中執行),建議 JDK 6.0 環境也采用該用具。<br/>
<pre name="java" id="java">import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTestHarnessV5 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.printf("%nEnter your regex: ");
Pattern pattern = Pattern.compile(scanner.nextLine());
System.out.printf("Enter input string to search: ");
Matcher matcher = pattern.matcher(scanner.nextLine());
boolean found = false;
while (matcher.find()) {
System.out.printf(
"I found the text \"%s\" starting at index %d and ending at index %d.%n",
matcher.group(), matcher.start(), matcher.end()
);
found = true;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -