特殊字符正则表达式Java,java正则表达式符号

  特殊字符正则表达式Java,java正则表达式符号

  00-1010 I .预定义字符类II。量词III。捕获组

  

目录

Java正则表达式API也接受预定义的字符类。上面的一些字符类可以用更短的形式来表示,虽然这样会降低代码的直观性。这个正则表达式的Java版本的一个特殊方面是转义字符。

 

  正如我们将看到的,大多数字符以反斜杠开头,这在Java中有特殊的含义。要让pattern类编译这些代码,必须对前导反斜杠进行转义,即。d变成了 d。

  匹配数字,相当于[0-9]:

  @ test public void given digits _ when matches _ then correct(){ int matches=runTest( d , 123 );assertEquals(匹配,3);}匹配一个非数字,相当于[0-9]:

  @ test public void given nondigits _ when matches _ then correct(){ int matches=runTest( D , a6c );assertEquals(匹配,2);}匹配空白:

  @ Testpublic void given white space _ when matches _ then correct(){ int matches=runTest( s , a c );assertEquals(匹配,1);}匹配非空白:

  @ test public void given nonwhitespace _ when matches _ then correct(){ int matches=runTest( S , a c );assertEquals(匹配,2);}匹配一个单词字符,相当于[a-zA-z0-9]:

  @ test public void given word character _ when matches _ then correct(){ int matches=runTest( w , hi!);assertEquals(匹配,2);}匹配非单词字符:

  @ test public void given nonwordcharacter _ when matches _ then correct(){ int matches=runTest( W , hi!);assertEquals(匹配,1);}

  

一、Predefined字符类

Java正则表达式API也允许我们使用量词。通过指定匹配的数量,我们可以进一步调整匹配行为。

 

  为了匹配零个或一个文本,我们使用。量词:

  @ Testpublic void givenZeroOrOneQuantifier _ when matches _ then correct(){ int matches=runTest( a?,‘嗨’);assertEquals(匹配,3);}或者,我们可以使用大括号语法,Java regex API也支持这种语法:

  @ Testpublic void givenZeroOrOneQuantifier _ when matches _ then correct 2(){ int matches=runTest( a { 0,1} , hi );assertEquals(匹配,3);}这个例子引入了零长度匹配的概念。碰巧的是,如果量词的匹配阈值为零,它总是匹配文本中的所有内容,包括每个输入末尾的空字符串。这意味着即使输入为空,它也将返回零长度匹配。

  这解释了为什么在上面的例子中,尽管字符串长度是2,我们仍然得到3个匹配。第三个匹配是长度为零的空字符串。

  为了匹配零次或无限次的文本,我们使用量词*,与?

  re class="brush:java;">@Testpublic void givenZeroOrManyQuantifier_whenMatches_thenCorrect() { int matches = runTest("\a*", "hi"); assertEquals(matches, 3);}支持的替代方案:

  

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

差异量词为+,匹配阈值为1。如果所需的字符串根本不出现,则将不存在匹配项,甚至不存在长度为零的字符串:

 

  

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

支持的替代方案:

 

  

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

正如在Perl和其他语言中一样,大括号语法可用于多次匹配给定文本:

 

  

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

在上面的例子中,我们得到了两个匹配项,因为只有当a在一行中出现三次时,才会出现匹配项。但是,在下一次测试中,我们不会得到匹配,因为文本在一行中只出现两次:

 

  

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

当我们在大括号中使用范围时,匹配将是贪婪的,从范围的高端匹配:

 

  

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

我们已经指定了至少两次但不超过三次,所以我们得到一个匹配,匹配者看到一个aaa和一个无法匹配的a

 

  然而,API允许我们指定一种懒惰或不情愿的方法,以便匹配器可以从范围的低端开始,在这种情况下,匹配两个匹配项aa和aa:

  

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

 

  

三、Capturing Groups

API还允许我们通过Capturing Groups将多个角色视为一个单元。它会将数字附加到Capturing Groups,并允许使用这些数字进行反向引用。

 

  在本节中,我们将看到一些关于如何在Java正则表达式API中使用Capturing Groups的示例。

  让我们使用一个仅当输入文本包含两个相邻数字时才匹配的Capturing Groups:

  

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

上面匹配的数字是1,使用back引用告诉匹配者我们想要匹配文本匹配部分的另一个匹配项。这样做,而不是:

 

  

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

如果输入有两个单独的匹配项,我们可以有一个匹配项,但使用反向引用传播相同的正则表达式匹配项以跨越输入的整个长度:

 

  

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

我们必须重复正则表达式,而无需反向引用,才能获得相同的结果:

 

  

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

类似地,对于任何其他重复次数,反向引用可以使匹配者将输入视为单个匹配:

 

  

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

但如果你甚至改变了最后一个数字,匹配就会失败:

 

  

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

重要的是不要忘记转义反斜杠,这在Java语法中至关重要。

 

  到此这篇关于Java正则表达式API字符类的文章就介绍到这了,更多相关Java正则表达式 内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: