Java 正則表達式教程及示例

2021-03-02 ImportNew

(點擊上方公眾號,可快速關注)

來源:ImportNew - 讀者,

如有好文章投稿,請點擊 → 這裡了解詳情

當我開始我的Java職業生涯的時候,對於我來說正則表達式簡直是個是夢魘。本教程旨在幫助你駕馭Java正則表達式,同時也幫助我複習正則表達式。

什麼是正則表達式?

正則表達式定義了字符串的模式。正則表達式可以用來搜索、編輯或處理文本。正則表達式並不僅限於某一種語言,但是在每種語言中有細微的差別。Java正則表達式和Perl的是最為相似的。

Java正則表達式的類在 java.util.regex 包中,包括三個類:Pattern,Matcher 和 PatternSyntaxException。

Pattern對象是正則表達式的已編譯版本。他沒有任何公共構造器,我們通過傳遞一個正則表達式參數給公共靜態方法 compile 來創建一個pattern對象。

Matcher是用來匹配輸入字符串和創建的 pattern 對象的正則引擎對象。這個類沒有任何公共構造器,我們用patten對象的matcher方法,使用輸入字符串作為參數來獲得一個Matcher對象。然後使用matches方法,通過返回的布爾值判斷輸入字符串是否與正則匹配。

如果正則表達式語法不正確將拋出PatternSyntaxException異常。

讓我們在一個簡單的例子裡看看這些類是怎麼用的吧

package com.journaldev.util;

 

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

public class RegexExamples {

 

    public static void main(String[] args) {

        // using pattern with flags

        Pattern pattern = Pattern.compile("ab", Pattern.CASE_INSENSITIVE);

        Matcher matcher = pattern.matcher("ABcabdAb");

        // using Matcher find(), group(), start() and end() methods

        while (matcher.find()) {

            System.out.println("Found the text \"" + matcher.group()

                    + "\" starting at " + matcher.start()

                    + " index and ending at index " + matcher.end());

        }

 

        // using Pattern split() method

        pattern = Pattern.compile("\\W");

        String[] words = pattern.split("one@two#three:four$five");

        for (String s : words) {

            System.out.println("Split using Pattern.split(): " + s);

        }

 

        // using Matcher.replaceFirst() and replaceAll() methods

        pattern = Pattern.compile("1*2");

        matcher = pattern.matcher("11234512678");

        System.out.println("Using replaceAll: " + matcher.replaceAll("_"));

        System.out.println("Using replaceFirst: " + matcher.replaceFirst("_"));

    }

 

}

上述程序的輸出是:

Input String matches regex - true

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0

*xx*

^

at java.util.regex.Pattern.error(Pattern.java:1924)

at java.util.regex.Pattern.sequence(Pattern.java:2090)

at java.util.regex.Pattern.expr(Pattern.java:1964)

at java.util.regex.Pattern.compile(Pattern.java:1665)

at java.util.regex.Pattern.(Pattern.java:1337)

at java.util.regex.Pattern.compile(Pattern.java:1022)

at com.journaldev.util.PatternExample.main(PatternExample.java:13)

既然正則表達式總是和字符串有關, Java 1.4對String類進行了擴展,提供了一個matches方法來匹配pattern。在方法內部使用Pattern和Matcher類來處理這些東西,但顯然這樣減少了代碼的行數。

Pattern類同樣有matches方法,可以讓正則和作為參數輸入的字符串匹配,輸出布爾值結果。

下述的代碼可以將輸入字符串和正則表達式進行匹配。

String str = "bbb";

System.out.println("Using String matches method: "+str.matches(".bb"));

System.out.println("Using Pattern matches method: "+Pattern.matches(".bb", str));

所以如果你的需要僅僅是檢查輸入字符串是否和pattern匹配,你可以通過調用String的matches方法省下時間。只有當你需要操作輸入字符串或者重用pattern的時候,你才需要使用Pattern和Matches類。

注意由正則定義的pattern是從左至右應用的,一旦一個原字符在一次匹配中使用過了,將不會再次使用。

例如,正則「121」只會匹配兩次字符串「31212142121″,就像這樣「_121____121″。

正則表達式通用匹配符號


Java正則表達式元字符

有兩種方法可以在正則表達式中像一般字符一樣使用元字符。

在元字符前添加反斜槓(\)

將元字符置於\Q(開始引用)和\E(結束引用)間

正則表達式量詞

量詞指定了字符匹配的發生次數。

量詞可以和character classes和capturing group一起使用。

例如,[abc]+表示a,b或c出現一次或者多次。

 (abc)+表示capturing group 「abc」出現一次或多次。我們即將討論capturing group。

正則表達式capturing group

Capturing group是用來對付作為一個整體出現的多個字符。你可以通過使用()來建立一個group。輸入字符串中和capturing group相匹配的部分將保存在內存裡,並且可以通過使用Backreference調用。

你可以使用matcher.groupCount方法來獲得一個正則pattern中capturing groups的數目。例如((a)(bc))包含3個capturing groups; ((a)(bc)), (a) 和 (bc)。

你可以使用在正則表達式中使用Backreference,一個反斜槓(\)接要調用的group號碼。

Capturing groups和Backreferences可能很令人困惑,所以我們通過一個例子來理解。

System.out.println(Pattern.matches("(\\w\\d)\\1", "a2a2")); //true

    System.out.println(Pattern.matches("(\\w\\d)\\1", "a2b2")); //false

    System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B2AB")); //true

    System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B3AB")); //false

在第一個例子裡,運行的時候第一個capturing group是(\w\d),在和輸入字符串「a2a2″匹配的時候獲取「a2″並保存到內存裡。因此\1是」a2」的引用,並且返回true。基於相同的原因,第二行代碼列印false。

試著自己理解第三行和第四行代碼。:)

現在我們來看看Pattern和Matcher類中一些重要的方法。

我們可以創建一個帶有標誌的Pattern對象。例如Pattern.CASE_INSENSITIVE可以進行大小寫不敏感的匹配。Pattern類同樣提供了和String類相似的split(String) 方法

Pattern類toString()方法返回被編譯成這個pattern的正則表達式字符串。

Matcher類有start()和end()索引方法,他們可以顯示從輸入字符串中匹配到的準確位置。

Matcher類同樣提供了字符串操作方法replaceAll(String replacement)和replaceFirst(String replacement)。

現在我們在一個簡單的java類中看看這些函數是怎麼用的。

package com.journaldev.util;

 

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

public class RegexExamples {

 

    public static void main(String[] args) {

        // using pattern with flags

        Pattern pattern = Pattern.compile("ab", Pattern.CASE_INSENSITIVE);

        Matcher matcher = pattern.matcher("ABcabdAb");

        // using Matcher find(), group(), start() and end() methods

        while (matcher.find()) {

            System.out.println("Found the text \"" + matcher.group()

                    + "\" starting at " + matcher.start()

                    + " index and ending at index " + matcher.end());

        }

 

        // using Pattern split() method

        pattern = Pattern.compile("\\W");

        String[] words = pattern.split("one@two#three:four$five");

        for (String s : words) {

            System.out.println("Split using Pattern.split(): " + s);

        }

 

        // using Matcher.replaceFirst() and replaceAll() methods

        pattern = Pattern.compile("1*2");

        matcher = pattern.matcher("11234512678");

        System.out.println("Using replaceAll: " + matcher.replaceAll("_"));

        System.out.println("Using replaceFirst: " + matcher.replaceFirst("_"));

    }

 

}

上述程序的輸出:

Found the text "AB" starting at 0 index and ending at index 2

Found the text "ab" starting at 3 index and ending at index 5

Found the text "Ab" starting at 6 index and ending at index 8

Split using Pattern.split(): one

Split using Pattern.split(): two

Split using Pattern.split(): three

Split using Pattern.split(): four

Split using Pattern.split(): five

Using replaceAll: _345_678

Using replaceFirst: _34512678

看完本文有收穫?請轉發分享給更多人

關注「ImportNew」,提升Java技能

相關焦點

  • C++、Java、JavaScript中的正則表達式
    上面一個示例中用到的「^」、「w」、「{5,17}」等都是正則表達式中的常用符號,這些符號在正則表達式中都有特殊的含意。下面這個表格是Java中的正則表達式常用符號的含意(只抽取了其常用的部分進行說明,就這些部分其實可以解決關於正則表達式的絕大多數的問題了)。
  • 給JAVA程式設計師的正則表達式一課
    正則基礎正則表達式(Regex,簡稱RE)是一種根據字符串集中的每個字符串的共同特徵來描述字符串集的方法。可用於搜索,編輯或處理文本和數據。簡單來說,正則表達式是幫助我們根據特定格式驗證或匹配字符串的方式。可以類比資料庫的SQL語言,sql是搜索數據,RE是搜索字符串。正則表達式和SQL語言是開發界的兩個偉大發明。
  • Java的正則表達式和捕獲組
    正則表達式定義了字符串的模式。正則表達式可以用來搜索、編輯或處理文本。正則表達式並不僅限於某一種語言,在Java、JavaScript等語言都存在,但是在每種語言中有細微的差別。Java正則表達式正則表達式實例一個字符串其實就是一個簡單的正則表達式,例如 Hello World正則表達式匹配 "Hello World" 字符串。.
  • java正則表達式入坑指南
    在日常開發工作中,無論你使用的語言是java、python、shell、golang還是C#, 正則表達式是程式語言中幾乎繞不開的話題。有了它,可以幫你快速定位到符合條件的文本內容。今天小編帶大家一起來學習下正則表達式,相信通過這篇文章的介紹,能為以後的工作提供一個更清晰的思路。
  • Perl教程 - 正則表達式
    教程 - 數組Perl教程 - 哈希Perl教程 - 文件操作Perl在IC設計中有廣泛的應用,而Perl的正則表達式則由其常見,它與Tcl等語言中的正則表達式有一定的相似之處,因此如果學習過相關正則表達式的話這個不會很難。
  • Python(2):正則表達式的常見符號與作用,每個都有示例
    承接上篇文章,本文將羅列出Python中正則表達式常用的符號,也叫做元字符,正是憑藉元字符正則表達式方才展現出強大的檢索功能和受人青睞的靈活性。常見的正則表達式特殊符號為了便於讀者保存,這裡把符號以表格圖片的形式總結給大家,並就常見的正則表達式給出簡單的示例供大家參考、學習。點號(.)
  • 正則表達式入門教程(下)
    正則表達式裡的分枝條件指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用 | 把不同的規則分隔開。聽不明白?請看示例:\b(\w+)\b\s+\1\b可以用來匹配重複的單詞,像go go, 或者kitty kitty。這個表達式首先是一個單詞,也就是單詞開始處和結束處之間的多於一個的字母或數字(\b(\w+)\b),這個單詞會被捕獲到編號為1的分組中,然後是1個或幾個空白符(\s+),最後是分組1中捕獲的內容(也就是前面匹配的那個單詞)(\1)。
  • 正則表達式入門教程 + 免費在線正則測試工具推薦
    正則表達式在計算機領域幾乎無所不在,但它又很難掌握,新手容易犯暈。如果你還處於入門學習階段,單靠腦子憑空寫一些複雜的正則,很難保證準確性,後面往往要花費大量時間去調試。其實,藉助一些可視化的正則測試工具網站,不僅能節省大量時間,還能對正則有更深的理解……什麼是正則表達式?
  • JMeter關聯:JMeter正則表達式提取器與JSON提取器
    接下來,我們以 WeatherWS 這個網站的兩個接口為示例,使用【正則表達式提取器】完成一個關聯實現。這就要用到【正則表達式提取器】了。在HTTP請求getRegionDataset上添加【後置處理器】-【正則表達式提取器】。2、【正則表達式提取器】:
  • 【教程】圖文解讀正則表達式的使用技巧
    一個好的正則表達式看起來像魔法,但請記住:任何足夠先進的技術都無法與魔法區分開來。所以,就讓我們揭開正則表達式的神秘面紗!如果你理解正則表達式,它會突然變成一個超快速和強大的工具……但你首先需要理解它,老實說,我覺得新手可能會對它望而生畏!讓我們從基礎開始。正則表達式(regex)是什麼?
  • 教程精選:正則表達式快速入門<二>
    在上篇文章裡,我們介紹了正則表達式的模式修正符與元字符,細心的讀者也許會發現,這部分介紹的非常簡略,而且很少有實際的例子的講解。這主要是因為網上現有的正則表達式資料都對這部分都有詳細的介紹和眾多的例子,如果覺得對前一部分缺乏了解可以參看這些資料。本文希望可以儘可能多涉及一些較高級的正則表達式特性。
  • 乾貨:java正則表達式匯總
    Email 正則表達式模式  ^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.IP位址正則表達式模式  ^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.  ([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?
  • Java和Groovy正則使用
    對於第一種返回json數據的可以直接用jsonobject解析。而第二種往往用HTML解析類做起來比較麻煩,特別是提取表單信息的時候,所以我直接當做string信息,通過正則表達式提取想要的信息。;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;
  • Python中的正則表達式
    什麼是正則表達式正則表達式是用於處理字符串的強大工具,它使用預定義的特定模式去匹配一類具有共同特徵的字符串,主要用於快速、準確地完成複雜字符串的查找、替換等。正則表達式進行匹配的流程如下圖所示:正則表達式匹配過程是:依次拿出表達式和文本中的字符比較,如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
  • 正則表達式在VBA中間是如何應用?正則表達式的實現方式?
    Hi,大家好,本章節開始將會從零開始和大家用圖文的方式,讓你從零基礎學會正則表達式!有興趣的小夥伴可以持續關注我,或者在專欄中進行查看自我學習,願與君攜手前行!在上一個章節說到正則表達式的入門級知識點,本節將會與大家分享一下正則表達式的是具體實現方式是怎麼樣的?
  • 8分鐘看完,徹底掌握Java正則表達式的十大問題!
    這篇文章總結了有關Java正則表達式的主要問題。希望可以給同學們帶來java學習路上的成長!1.如何從字符串中提取數字?使用正則表達式的一個常見問題是將所有數字提取到整數數組中。4.如何轉義文本以進行正則表達式?通常,正則表達式使用「 \」轉義結構,但是要在反斜槓之前加上另一個反斜槓以使Java字符串得以編譯是很痛苦的。用戶還有另一種方式將字符串Literals傳遞給Pattern,例如「 $ 5」。
  • 認識正則表達式(Java語言基礎)
    正則表達式:字符串表示正確規則的式子首先新建一個工程,創建一個類我們在獲取當前系統時間的時候,我們可以按照下面的方式輸出。會發現輸出的時間並不是很容易閱讀,我們能不能修改下它的顯示?首先我們需要了解一個方法matches(),該方法用於檢測字符串是否匹配給定的正則表達式,在字符串匹配給定的正則表達式時,返回 true,否則false。
  • JMeter系列教程二之正則表達式
    前面介紹了JMeter入門使用,本文我們來講講JMeter的正則表達式在使用Jmeter過程中,會經常使用到正則表達式提取器提取器
  • 刨根究底正則表達式(1):開篇
    正則表達式目前市面上並不缺乏專業著作,比如那本被譽為正則表達式學習聖經的《精通正則表達式》就很值得一讀,另外該書的譯者餘晟先生所寫的《正則指引》也不錯。如果僅用於入門,則《正則表達式必知必會》肯定不能錯過,還有網上流傳極廣的《正則表達式30分鐘入門教程》也是不錯的入門資料。但是,結合我自身痛苦的正則表達式學習經歷和運用體會,僅有這些是遠遠不夠的。
  • 萬字長文詳解Python正則表達式及re模塊
    P=name)來進行引用,示例如下這樣就可以完成一個簡單的匹配IP位址的表達式!零寬斷言就跟它的名字一樣,是一種零寬度的匹配,它匹配到的內容不會保存到匹配結果中去,最終匹配結果只是一個位置而已。作用是給指定位置添加一個限定條件,用來規定此位置之前或者之後的字符必須滿足限定條件才能使正則中的字表達式匹配成功。