<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Java正規表示式API也接受預定義的字元類。上面的一些字元類可以用更短的形式表示,儘管這會降低程式碼的直觀性。這個正規表示式的Java版本的一個特殊方面是跳脫字元。
正如我們將看到的,大多數位符都以反斜槓開頭,這在Java中有特殊的意義。對於要由模式類編譯的這些,必須跳脫前導反斜槓,即.d
變為\d
。
匹配的數位,相當於[0-9]
:
@Test public void givenDigits_whenMatches_thenCorrect() { int matches = runTest("\d", "123"); assertEquals(matches, 3); }
匹配非數位,相當於[^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); }
Java正規表示式API還允許我們使用Quantifiers。通過指定匹配的出現次數,我們可以進一步調整匹配的行為。
要匹配零次或一次文字,我們使用?
量詞:
@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); }
本例介紹了零長度匹配的概念。碰巧的是,如果一個量詞的匹配閾值為零,它總是匹配文字中的所有內容,包括每個輸入末尾的一個空字串。這意味著即使輸入為空,它也將返回一個零長度匹配。
這就解釋了為什麼在上面的範例中,儘管字串長度為2,但我們仍得到3個匹配項。第三個匹配項是長度為零的空字串。
為了匹配零次或無限次的文字,我們使用*
量詞,它與?:
@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。如果所需的字串根本不出現,則將不存在匹配項,甚至不存在長度為零的字串:
@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在一行中出現三次時,才會出現匹配項。但是,在下一次測試中,我們不會得到匹配,因為文字在一行中只出現兩次:
@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); }
我們已經指定了至少兩次但不超過三次,所以我們得到一個匹配,匹配者看到一個aaa
和一個無法匹配的a
。
然而,API允許我們指定一種懶惰或不情願的方法,以便匹配器可以從範圍的低端開始,在這種情況下,匹配兩個匹配項aa和aa:
@Test public void givenBraceQuantifierWithRange_whenMatchesLazily_thenCorrect() { int matches = runTest("a{2,3}?", "aaaa"); assertEquals(matches, 2); }
API還允許我們通過Capturing Groups將多個角色視為一個單元。它會將數位附加到Capturing Groups,並允許使用這些數位進行反向參照。
在本節中,我們將看到一些關於如何在Java正規表示式API中使用Capturing Groups的範例。
讓我們使用一個僅當輸入文字包含兩個相鄰數位時才匹配的Capturing Groups:
@Test public void givenCapturingGroup_whenMatches_thenCorrect() { int maches = runTest("(\d\d)", "12"); assertEquals(matches, 1); }
上面匹配的數位是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); }
我們必須重複正規表示式,而無需反向參照,才能獲得相同的結果:
@Test public void givenCapturingGroup_whenMatches_thenCorrect3() { int matches = runTest("(\d\d)(\d\d)", "1212"); assertEquals(matches, 1); }
類似地,對於任何其他重複次數,反向參照可以使匹配者將輸入視為單個匹配:
@Test public void givenCapturingGroup_whenMatchesWithBackReference_ thenCorrect2() { int matches = runTest("(\d\d)\1\1\1", "12121212"); assertEquals(matches, 1); }
但如果你甚至改變了最後一個數位,匹配就會失敗:
@Test public void givenCapturingGroupAndWrongInput_ whenMatchFailsWithBackReference_thenCorrect() { int matches = runTest("(\d\d)\1", "1213"); assertFalse(matches > 0); }
重要的是不要忘記跳脫反斜槓,這在Java語法中至關重要。
到此這篇關於Java正規表示式API字元類的文章就介紹到這了,更多相關Java正規表示式 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45