原文鏈接:
http://www.programcreek.com/2013/10/top-10-questions-for-java-regular-expression/
學習及翻譯如下,有理解不對及表達不清的地方,請讀者指正!
這裏列舉了最熱門的Java正則表達式問題。由於這些問題經常被問到,所以你可能也會覺得它們很好用。
1、如何從一個字符串中提取數字?
使用正則表達式的一個常見的問題是將所用的數字提取出來放到一個整型數組中。
在Java中,使用“\d ”來表示0~9的數字範圍。使用預定義的類型可以使你的程序更具有可讀性,並且還能減少錯亂字符帶來的錯誤。請參考預定義字符集來了解更多細節的東西。請注意“\d”中第一個反斜槓字符“\”。如果你使用的字符串中帶有反斜槓,那你需要在反斜槓前面再添加一個反斜槓,這樣才能正常編譯出反斜槓。這就是爲什麼我們使用“\\d”。
舉例如下:
List<Integer> numbers = new LinkedList<Integer>();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(str);
while (m.find()) {
numbers.add(Integer.parseInt(m.group()));
}
2、如何將字符串按行分割?
根據我們所使用的操作系統,我們有至少三種不同的方式來實現來添加換行符。
1. \r 代表輸出返回,在Unix中使用。
2. \n 代表換行,在蘋果操作系統中使用。
3. \r\n 代表輸出返回並換行,在Windows中使用。
因此,將字符串按行分割的最直接的方法是:
String lines[] = String.split("\\r?\\n");
但是如果你不想要那些空的行的話,可以用以下方法,這也是我最喜歡的方法:
String.split("[\\r\\n]+");
以下是與系統獨立的方式。但是如果有兩個空行挨在一起,你可能會得多空行。String.split(System.getProperty("line.separator"));
3、Pattern.compile() 的重要性
一個正則表達式就是一個字符串,必須先被編譯成一個Pattern類的實例。而Pattern.compile() 方法是將對象創建成實例的唯一方法。調用順序如下:
Pattern p = Pattern.compile("a*b");
Matcher matcher = p.matcher("aaaaab");
assert matcher.matches() == true;
基本上,Pattern.compile() 方法是用來將一個正則表達式轉換成一個有限的狀態集(請參考:Compilers: Principles, Techniques, and Tools (2nd Edition)這本書)。但是所有的狀態在比對時,都會保留其匹配狀態。通過這種方式,Pattern的實例p可以被重複使用。並且很多匹配器可以共用相同的模板。Matcher anotherMatcher = p.matcher("aab");
assert anotherMatcher.matches() == true;
Pattern.matches() 方法在使用正則表達式時是很方便的。這個方法使用compile() 來獲取一個Pattern類的實例,並匹配一個字符串。因此下面這行代碼和上面的代碼是一樣的效果的。
boolean b = Pattern.matches("a*b", "aaaaab");
4、如何擺脫正則表達式的文本?
一般來說,在正則表達式中,都會使用到反斜槓,但是在Java中,爲了使字符串能夠編譯通過,我們不得不痛苦的在反斜槓前使用新的反斜槓。有另一種方法能幫助用戶定義Pattern類型字符串,比如“$5”。爲了替代“\\$5”,我們可以這樣定義:
Pattern.quote("$5");
5、爲什麼String.split()這個方法需要限定符來退出?
String.split()通過給定的正則表達式把字符串分割。Java提供一種叫做“元配符”的特殊符號來影響pattern的匹配過程。“|”就是一個用來匹配一個正則表達式的幾種可能的正則表達式的特殊符號。舉個例子,A|B 表示A或者B。因此當需要使用“|”時,要在其前面使用反斜槓來表示,如:“\\|”。