好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java正则表达式API Matcher类方法

一、Pattern.DOTALL

默认情况下,当我们使用[.]时表达式中,我们将匹配输入字符串中的每个字符,直到遇到新行字符。

使用此标志,匹配也将包括行终止符。我们将通过以下示例更好地理解。这些例子将略有不同。由于我们感兴趣的是针对匹配的字符串进行断言,因此我们将使用matcher的group方法来返回之前的匹配。

首先,我们将看到默认行为:

?

1

2

3

4

5

6

7

8

9

10

@Test

public void givenRegexWithLineTerminator_whenMatchFails_thenCorrect() {

     Pattern pattern = Pattern测试数据pile( "(.*)" );

     Matcher matcher = pattern.matcher(

       "this is a text" + System.getProperty( "line.separator" )

         + " continued on another line" );

     matcher.find();

 

     assertEquals( "this is a text" , matcher.group( 1 ));

}

正如我们所看到的,只有行终止符之前输入的第一部分匹配。

现在在dotall模式下,包括行终止符在内的整个文本都将匹配:

?

1

2

3

4

5

6

7

8

9

10

11

@Test

public void givenRegexWithLineTerminator_whenMatchesWithDotall_thenCorrect() {

     Pattern pattern = Pattern测试数据pile( "(.*)" , Pattern.DOTALL);

     Matcher matcher = pattern.matcher(

       "this is a text" + System.getProperty( "line.separator" )

         + " continued on another line" );

     matcher.find();

     assertEquals(

       "this is a text" + System.getProperty( "line.separator" )

         + " continued on another line" , matcher.group( 1 ));

}

我们还可以使用嵌入的标志表达式来启用dotall模式:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

@Test

public void givenRegexWithLineTerminator_whenMatchesWithEmbeddedDotall

   _thenCorrect() {

    

     Pattern pattern = Pattern测试数据pile( "(?s)(.*)" );

     Matcher matcher = pattern.matcher(

       "this is a text" + System.getProperty( "line.separator" )

         + " continued on another line" );

     matcher.find();

 

     assertEquals(

       "this is a text" + System.getProperty( "line.separator" )

         + " continued on another line" , matcher.group( 1 ));

}

二、Pattern.LITERAL

在此模式下,matcher对任何元字符、转义字符或正则表达式语法都没有特殊意义。如果没有此标志,匹配器将根据任何输入字符串匹配以下正则表达式:

?

1

2

3

4

5

6

@Test

public void givenRegex_whenMatchesWithoutLiteralFlag_thenCorrect() {

     int matches = runTest( "(.*)" , "text" );

 

     assertTrue(matches > 0 );

}

这是我们在所有示例中看到的默认行为。但是,使用此标志时,将找不到匹配项,因为匹配器将查找 (.*) ,而不是解释它:

?

1

2

3

4

5

6

@Test

public void givenRegex_whenMatchFailsWithLiteralFlag_thenCorrect() {

     int matches = runTest( "(.*)" , "text" , Pattern.LITERAL);

 

     assertFalse(matches > 0 );

}

现在,如果我们添加所需的字符串,测试将通过:

?

1

2

3

4

5

6

@Test

public void givenRegex_whenMatchesWithLiteralFlag_thenCorrect() {

     int matches = runTest( "(.*)" , "text(.*)" , Pattern.LITERAL);

 

     assertTrue(matches > 0 );

}

没有用于启用文字分析的嵌入标志字符。

三、Pattern.MULTILINE

默认情况下, ^ 和 $ 元字符分别在整个输入字符串的开头和结尾绝对匹配。匹配器忽略任何行终止符:

?

1

2

3

4

5

6

7

8

@Test

public void givenRegex_whenMatchFailsWithoutMultilineFlag_thenCorrect() {

     int matches = runTest(

       "dog$" , "This is a dog" + System.getProperty( "line.separator" )

       + "this is a fox" );

 

     assertFalse(matches > 0 );

}

匹配失败,因为匹配器在整个字符串的末尾搜索 dog ,但狗出现在字符串第一行的末尾。

然而,有了这个标志,同样的测试也会通过,因为匹配器现在考虑了行终止符。因此,字符串 dog 正好在行终止之前找到,因此成功:

?

1

2

3

4

5

6

7

8

@Test

public void givenRegex_whenMatchesWithMultilineFlag_thenCorrect() {

     int matches = runTest(

       "dog$" , "This is a dog" + System.getProperty( "line.separator" )

       + "this is a fox" , Pattern.MULTILINE);

 

     assertTrue(matches > 0 );

}

以下是嵌入式标志版本:

?

1

2

3

4

5

6

7

8

9

@Test

public void givenRegex_whenMatchesWithEmbeddedMultilineFlag_

   thenCorrect() {

     int matches = runTest(

       "(?m)dog$" , "This is a dog" + System.getProperty( "line.separator" )

       + "this is a fox" );

 

     assertTrue(matches > 0 );

}

四、Matcher类方法

在本节中,我们将研究 Matcher 类的一些有用方法。为了清晰起见,我们将根据功能对它们进行分组。

索引方法

索引方法提供有用的索引值,精确显示在输入字符串中找到匹配项的位置。在下面的测试中,我们将确认输入字符串中 dog 匹配的开始和结束索引:

?

1

2

3

4

5

6

7

8

9

@Test

public void givenMatch_whenGetsIndices_thenCorrect() {

     Pattern pattern = Pattern测试数据pile( "dog" );

     Matcher matcher = pattern.matcher( "This dog is mine" );

     matcher.find();

 

     assertEquals( 5 , matcher.start());

     assertEquals( 8 , matcher.end());

}

Study方法

Study方法遍历输入字符串并返回一个布尔值,指示是否找到该模式。常用的是 matches 和 lookingAt 方法。

matches 和 lookingAt 方法都试图根据模式匹配输入序列。不同之处在于,匹配需要匹配整个输入序列,而 lookingAt 则不需要。

这两种方法都从输入字符串的开头开始:

?

1

2

3

4

5

6

7

8

@Test

public void whenStudyMethodsWork_thenCorrect() {

     Pattern pattern = Pattern测试数据pile( "dog" );

     Matcher matcher = pattern.matcher( "dogs are friendly" );

 

     assertTrue(matcher.lookingAt());

     assertFalse(matcher.matches());

}

matches 方法将在如下情况下返回 true :

?

1

2

3

4

5

6

7

@Test

public void whenMatchesStudyMethodWorks_thenCorrect() {

     Pattern pattern = Pattern测试数据pile( "dog" );

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

 

     assertTrue(matcher.matches());

}

Replacement方法

Replacement方法可用于替换输入字符串中的文本。常见的是 replaceFirst 和 replaceAll 。

replaceFirst 和 replaceAll 方法替换与给定正则表达式匹配的文本。正如其名称所示, replaceFirst 替换第一个引用, replaceAll 替换所有引用:

?

1

2

3

4

5

6

7

8

9

10

@Test

public void whenReplaceFirstWorks_thenCorrect() {

     Pattern pattern = Pattern测试数据pile( "dog" );

     Matcher matcher = pattern.matcher(

       "dogs are domestic animals, dogs are friendly" );

     String newStr = matcher.replaceFirst( "cat" );

 

     assertEquals(

       "cats are domestic animals, dogs are friendly" , newStr);

}

替换所有引用:

?

1

2

3

4

5

6

7

8

9

@Test

public void whenReplaceAllWorks_thenCorrect() {

     Pattern pattern = Pattern测试数据pile( "dog" );

     Matcher matcher = pattern.matcher(

       "dogs are domestic animals, dogs are friendly" );

     String newStr = matcher.replaceAll( "cat" );

 

     assertEquals( "cats are domestic animals, cats are friendly" , newStr);

}

replaceAll 方法允许我们用相同的替换替换所有匹配项。

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

原文链接:https://javakk测试数据/2671.html

查看更多关于Java正则表达式API Matcher类方法的详细内容...

  阅读:23次