最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java正則表達式API字符類

 更新時間:2022年06月09日 15:49:08   作者:?sofia  
這篇文章主要介紹了Java正則表達式API字符類,Java正則表達式API也接受預(yù)定義的字符類,下面文章內(nèi)容展開了更多的相關(guān)內(nèi)容介紹,需要的朋友可以參考一下

一、Predefined字符類

Java正則表達式API也接受預(yù)定義的字符類。上面的一些字符類可以用更短的形式表示,盡管這會降低代碼的直觀性。這個正則表達式的Java版本的一個特殊方面是轉(zhuǎn)義字符。

正如我們將看到的,大多數(shù)字符都以反斜杠開頭,這在Java中有特殊的意義。對于要由模式類編譯的這些,必須轉(zhuǎn)義前導(dǎo)反斜杠,即.\d變?yōu)?code>\\d。

匹配的數(shù)字,相當于[0-9]

@Test
public void givenDigits_whenMatches_thenCorrect() {
    int matches = runTest("\\d", "123");
 
    assertEquals(matches, 3);
}

匹配非數(shù)字,相當于[^0-9]

@Test
public void givenNonDigits_whenMatches_thenCorrect() {
    int mathces = runTest("\\D", "a6c");
 
    assertEquals(matches, 2);
}

匹配空白:

@Test
public void givenWhiteSpace_whenMatches_thenCorrect() {
    int matches = runTest("\\s", "a c");
 
    assertEquals(matches, 1);
}

匹配非空白:

@Test
public void givenNonWhiteSpace_whenMatches_thenCorrect() {
    int matches = runTest("\\S", "a c");
 
    assertEquals(matches, 2);
}

匹配一個單詞字符,相當于[a-zA-Z_0-9]

@Test
public void givenWordCharacter_whenMatches_thenCorrect() {
    int matches = runTest("\\w", "hi!");
 
    assertEquals(matches, 2);
}

匹配非單詞字符:

@Test
public void givenNonWordCharacter_whenMatches_thenCorrect() {
    int matches = runTest("\\W", "hi!");
 
    assertEquals(matches, 1);
}

二、Quantifiers

Java正則表達式API還允許我們使用Quantifiers。通過指定匹配的出現(xiàn)次數(shù),我們可以進一步調(diào)整匹配的行為。

要匹配零次或一次文本,我們使用?量詞:

@Test
public void givenZeroOrOneQuantifier_whenMatches_thenCorrect() {
    int matches = runTest("\\a?", "hi");
 
    assertEquals(matches, 3);
}

或者,我們可以使用大括號語法,Java regex API也支持這種語法:

@Test
public void givenZeroOrOneQuantifier_whenMatches_thenCorrect2() {
    int matches = runTest("\\a{0,1}", "hi");
 
    assertEquals(matches, 3);
}

本例介紹了零長度匹配的概念。碰巧的是,如果一個量詞的匹配閾值為零,它總是匹配文本中的所有內(nèi)容,包括每個輸入末尾的一個空字符串。這意味著即使輸入為空,它也將返回一個零長度匹配。

這就解釋了為什么在上面的示例中,盡管字符串長度為2,但我們?nèi)缘玫?個匹配項。第三個匹配項是長度為零的空字符串。

為了匹配零次或無限次的文本,我們使用*量詞,它與?:

@Test
public void givenZeroOrManyQuantifier_whenMatches_thenCorrect() {
     int matches = runTest("\\a*", "hi");
 
     assertEquals(matches, 3);
}

支持的替代方案:

@Test
public void givenZeroOrManyQuantifier_whenMatches_thenCorrect2() {
    int matches = runTest("\\a{0,}", "hi");
 
    assertEquals(matches, 3);
}

差異量詞為+,匹配閾值為1。如果所需的字符串根本不出現(xiàn),則將不存在匹配項,甚至不存在長度為零的字符串:

@Test
public void givenOneOrManyQuantifier_whenMatches_thenCorrect() {
    int matches = runTest("\\a+", "hi");
 
    assertFalse(matches);
}

支持的替代方案:

@Test
public void givenOneOrManyQuantifier_whenMatches_thenCorrect2() {
    int matches = runTest("\\a{1,}", "hi");
 
    assertFalse(matches);
}

正如在Perl和其他語言中一樣,大括號語法可用于多次匹配給定文本:

@Test
public void givenBraceQuantifier_whenMatches_thenCorrect() {
    int matches = runTest("a{3}", "aaaaaa");
 
    assertEquals(matches, 2);
}

在上面的例子中,我們得到了兩個匹配項,因為只有當a在一行中出現(xiàn)三次時,才會出現(xiàn)匹配項。但是,在下一次測試中,我們不會得到匹配,因為文本在一行中只出現(xiàn)兩次:

@Test
public void givenBraceQuantifier_whenFailsToMatch_thenCorrect() {
    int matches = runTest("a{3}", "aa");
 
    assertFalse(matches > 0);
}

當我們在大括號中使用范圍時,匹配將是貪婪的,從范圍的高端匹配:

@Test
public void givenBraceQuantifierWithRange_whenMatches_thenCorrect() {
    int matches = runTest("a{2,3}", "aaaa");
 
    assertEquals(matches, 1);
}

我們已經(jīng)指定了至少兩次但不超過三次,所以我們得到一個匹配,匹配者看到一個aaa和一個無法匹配的a。

然而,API允許我們指定一種懶惰或不情愿的方法,以便匹配器可以從范圍的低端開始,在這種情況下,匹配兩個匹配項aa和aa:

@Test
public void givenBraceQuantifierWithRange_whenMatchesLazily_thenCorrect() {
    int matches = runTest("a{2,3}?", "aaaa");
 
    assertEquals(matches, 2);
}

三、Capturing Groups

API還允許我們通過Capturing Groups將多個角色視為一個單元。它會將數(shù)字附加到Capturing Groups,并允許使用這些數(shù)字進行反向引用。

在本節(jié)中,我們將看到一些關(guān)于如何在Java正則表達式API中使用Capturing Groups的示例。

讓我們使用一個僅當輸入文本包含兩個相鄰數(shù)字時才匹配的Capturing Groups:

@Test
public void givenCapturingGroup_whenMatches_thenCorrect() {
    int maches = runTest("(\\d\\d)", "12");
 
    assertEquals(matches, 1);
}

上面匹配的數(shù)字是1,使用back引用告訴匹配者我們想要匹配文本匹配部分的另一個匹配項。這樣做,而不是:

@Test
public void givenCapturingGroup_whenMatches_thenCorrect2() {
    int matches = runTest("(\\d\\d)", "1212");
 
    assertEquals(matches, 2);
}

如果輸入有兩個單獨的匹配項,我們可以有一個匹配項,但使用反向引用傳播相同的正則表達式匹配項以跨越輸入的整個長度:

@Test
public void givenCapturingGroup_whenMatchesWithBackReference_
  thenCorrect() {
    int matches = runTest("(\\d\\d)\\1", "1212");
 
    assertEquals(matches, 1);
}

我們必須重復(fù)正則表達式,而無需反向引用,才能獲得相同的結(jié)果:

@Test
public void givenCapturingGroup_whenMatches_thenCorrect3() {
    int matches = runTest("(\\d\\d)(\\d\\d)", "1212");
 
    assertEquals(matches, 1);
}

類似地,對于任何其他重復(fù)次數(shù),反向引用可以使匹配者將輸入視為單個匹配:

@Test
public void givenCapturingGroup_whenMatchesWithBackReference_
  thenCorrect2() {
    int matches = runTest("(\\d\\d)\\1\\1\\1", "12121212");
 
    assertEquals(matches, 1);
}

但如果你甚至改變了最后一個數(shù)字,匹配就會失?。?/strong>

@Test
public void givenCapturingGroupAndWrongInput_
  whenMatchFailsWithBackReference_thenCorrect() {
    int matches = runTest("(\\d\\d)\\1", "1213");
 
    assertFalse(matches > 0);
}

重要的是不要忘記轉(zhuǎn)義反斜杠,這在Java語法中至關(guān)重要。

到此這篇關(guān)于Java正則表達式API字符類的文章就介紹到這了,更多相關(guān)Java正則表達式 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java單向鏈表的實現(xiàn)實例

    java單向鏈表的實現(xiàn)實例

    java單向鏈表的實現(xiàn)實例。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • Elasticsearch常見字段映射類型之scaled_float解讀

    Elasticsearch常見字段映射類型之scaled_float解讀

    這篇文章主要介紹了Elasticsearch常見字段映射類型之scaled_float解讀。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java中輸入輸出方式詳細講解

    Java中輸入輸出方式詳細講解

    這篇文章主要給大家介紹了關(guān)于Java中輸入輸出方式的相關(guān)資料,Java輸入輸出是指使用java提供的一些類和方法來實現(xiàn)數(shù)據(jù)的輸入和輸出,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • SpringBoot中的@EnableAutoConfiguration注解解析

    SpringBoot中的@EnableAutoConfiguration注解解析

    這篇文章主要介紹了SpringBoot中的@EnableAutoConfiguration注解解析,@EnableAutoConfiguration也是借助@Import的幫助,將所有符合自動配置條件的bean定義注冊到IoC容器,需要的朋友可以參考下
    2023-09-09
  • Maven build 命令介紹的使用詳解

    Maven build 命令介紹的使用詳解

    這篇文章主要介紹了Maven build 命令介紹的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java Socket編程簡介_動力節(jié)點Java學(xué)院整理

    Java Socket編程簡介_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了Java Socket編程簡介的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-05-05
  • MyBatis查詢返回Map示例代碼

    MyBatis查詢返回Map示例代碼

    這篇文章主要給大家介紹了關(guān)于MyBatis查詢返回Map的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • 詳解springmvc如何處理接受http請求

    詳解springmvc如何處理接受http請求

    這篇文章主要給大家介紹了springmvc如何處理接受http請求,文中通過代碼示例給大家講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Java實現(xiàn)手寫線程池的示例代碼

    Java實現(xiàn)手寫線程池的示例代碼

    在我們的日常的編程當中,并發(fā)是始終離不開的主題,而在并發(fā)多線程當中,線程池又是一個不可規(guī)避的問題。本文就來分享一下如何自己手寫一個線程池,需要的可以參考一下
    2022-08-08
  • Java SpringBoot整合SpringCloud

    Java SpringBoot整合SpringCloud

    SpringCloud專注于為典型的用例和擴展機制提供良好的開箱即用體驗,今天小編就帶大家認識SpringCloud都有些什么特點,感興趣的小伙伴留下來閱讀全文吧
    2021-09-09

最新評論

丹东市| 富民县| 江陵县| 江津市| 兴业县| 武城县| 沂南县| 缙云县| 云浮市| 仙居县| 嘉义县| 贡嘎县| 陕西省| 马边| 泾川县| 崇信县| 文山县| 宜章县| 尤溪县| 深水埗区| 泽州县| 墨竹工卡县| 盖州市| 云阳县| 永定县| 澳门| 定南县| 枣强县| 洛扎县| 兴和县| 随州市| 永靖县| 长乐市| 伊宁县| 分宜县| 惠水县| 双鸭山市| 隆德县| 垦利县| 浏阳市| 璧山县|