讓我們繼續研究正規表示式。在本文中,我們將研究預先定義的字元類別以及量化(搜尋序列)。
預定義字元類
類 APIPattern
包含預先定義的字元類,為常用的正規表示式提供方便的捷徑。 在此表中,左列中的構造是右列中表達式的簡寫表示。例如,\d
表示數字(0-9),\w
表示任何大寫或小寫字母、底線或數字)。盡可能使用預先定義的字元類別。這將使您的程式碼更易於閱讀和修復錯誤。以反斜線開頭的結構稱為轉義或受保護。在之前的文章中,我們已經討論過使用反斜線或符號轉義特殊字元\Q
並將\E
其用作常規字元。如果將反斜線與常規字元(文字)一起使用,則需要轉義反斜線才能編譯表達式。
private final String REGEX = "\\d"; // цифра
在這個例子中\d
,一個正規表示式;程式編譯需要額外的反斜線。我們的測試程式直接從控制台讀取正規表示式,因此不需要額外的斜線。下面的範例示範了預定義字元類別的使用: 在前三個範例中,正規表示式只是「.
」(點特殊字元),表示任何字元。因此,在所有情況下搜尋都是成功的。其他範例使用預先定義的字元類,我們在上表中討論了其含義。
量詞
量詞可讓您指定字元在字串中出現的次數。讓我們仔細看看貪婪、惰性和非常貪婪量詞如何運作的複雜性。乍一看,量詞 X?, X?? 和 X?+ 的工作方式相同:“X 出現一次或根本不存在。” 這些量詞的實作略有不同,我們將在下面討論。零長度匹配
讓我們從貪婪的開始。讓我們寫三個不同的正規表示式:帶有特殊字元 ?、* 或 + 的字母「a」。讓我們看看如果在空白行上測試這些正規表示式會發生什麼: 在上面的範例中,前兩種情況搜尋成功,因為表達式 a? a* 允許字串中缺少字元 a。另請注意,開始匹配索引和最後匹配索引相同 (0)。由於輸入字串沒有長度,因此程式在第一個位置找不到任何內容:)。這種情況稱為零長度匹配。此類匹配發生在多種情況下:當輸入行為空時、在輸入行的開頭、在該行的最後一個字元之後或在該行的字元之間。零長度匹配很容易發現:它們在同一位置開始和結束。讓我們看一些零長度匹配的更多範例。讓我們透過更多範例來探討零長度匹配。讓我們將輸入字串更改為字元“a”並觀察一個有趣的效果: 所有三個量詞都找到了字元“a”,但前兩個量詞(允許不存在字元)在位置1 處找到了零長度匹配- 在字串的最後一個字元之後。發生這種情況是因為程式將字元“a”視為字串並“運行”它,直到不再有匹配項為止。根據所使用的量詞,程式將或不會在字串末尾找到“nothing”。現在讓我們將輸入字串更改為五個字母「a」的序列: 正規表示式 a?分別找出字串中每個字母的符合項目。表達式 a* 找到兩個匹配項:字元序列「a」'和位置 5 處的零長度匹配項。最後,正規表示式 a+ 只找到字元「a」的序列,而沒有找到「nothing」:) 如果給出包含不同字元的字串作為輸入,會發生什麼事?例如,「ababaaaab」: 字元「b」位於位置 1、3 和 8,且程式在這些位置找到零長度匹配。正規表示式a? 不關注“b”,而只是查找字元“a”是否存在(或不存在)。如果量詞允許不存在“a”,則字串中除“a”之外的所有字元都會顯示為零長度匹配。若要尋找給定長度的序列,只需在大括號中指定長度即可: 正規表示式 a{3} 搜尋包含三個「a」字元的序列。第一行中沒有找到任何內容,因為該行中沒有足夠的 a。第二個包含程式找到的 3 個字元。第三個測試還在字串的開頭找到匹配項。第三個字元之後的所有內容都不滿足正規表示式,在下面的程式碼中它滿足正則表達式,並且將有多個匹配項: 要指定最小序列長度,請使用:Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
在此範例中,程式只找到一個符合項,因為該字串滿足 (3) 個「a」字元的最小序列長度要求。最後,設定最大序列長度: 在本例中,第一個匹配在第六個字元處結束。第二個匹配包含第六個之後的字符,因為 它們滿足最小長度要求。如果字串短一個字符,則不會有第二個匹配項。
GO TO FULL VERSION