Java正则表达式API Matcher类方法

目录
  • 一、Pattern.DOTALL
  • 二、Pattern.LITERAL
  • 三、Pattern.MULTILINE
  • 四、Matcher类方法
    • 索引方法
    • Study方法
    • Replacement方法

一、Pattern.DOTALL

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

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

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

@Test
public void givenRegexWithLineTerminator_whenMatchFails_thenCorrect() {
    Pattern pattern = Pattern.compile("(.*)");
    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模式下,包括行终止符在内的整个文本都将匹配:

@Test
public void givenRegexWithLineTerminator_whenMatchesWithDotall_thenCorrect() {
    Pattern pattern = Pattern.compile("(.*)", 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模式:

@Test
public void givenRegexWithLineTerminator_whenMatchesWithEmbeddedDotall
  _thenCorrect() {

    Pattern pattern = Pattern.compile("(?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对任何元字符、转义字符或正则表达式语法都没有特殊意义。如果没有此标志,匹配器将根据任何输入字符串匹配以下正则表达式:

@Test
public void givenRegex_whenMatchesWithoutLiteralFlag_thenCorrect() {
    int matches = runTest("(.*)", "text");

    assertTrue(matches > 0);
}

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

@Test
public void givenRegex_whenMatchFailsWithLiteralFlag_thenCorrect() {
    int matches = runTest("(.*)", "text", Pattern.LITERAL);

    assertFalse(matches > 0);
}

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

@Test
public void givenRegex_whenMatchesWithLiteralFlag_thenCorrect() {
    int matches = runTest("(.*)", "text(.*)", Pattern.LITERAL);

    assertTrue(matches > 0);
}

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

三、Pattern.MULTILINE

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

@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正好在行终止之前找到,因此成功:

@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);
}

以下是嵌入式标志版本:

@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匹配的开始和结束索引:

@Test
public void givenMatch_whenGetsIndices_thenCorrect() {
    Pattern pattern = Pattern.compile("dog");
    Matcher matcher = pattern.matcher("This dog is mine");
    matcher.find();

    assertEquals(5, matcher.start());
    assertEquals(8, matcher.end());
}

Study方法

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

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

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

@Test
public void whenStudyMethodsWork_thenCorrect() {
    Pattern pattern = Pattern.compile("dog");
    Matcher matcher = pattern.matcher("dogs are friendly");

    assertTrue(matcher.lookingAt());
    assertFalse(matcher.matches());
}

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

@Test
public void whenMatchesStudyMethodWorks_thenCorrect() {
    Pattern pattern = Pattern.compile("dog");
    Matcher matcher = pattern.matcher("dog");

    assertTrue(matcher.matches());
}

Replacement方法

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

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

@Test
public void whenReplaceFirstWorks_thenCorrect() {
    Pattern pattern = Pattern.compile("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);
}

替换所有引用:

@Test
public void whenReplaceAllWorks_thenCorrect() {
    Pattern pattern = Pattern.compile("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正则表达式 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java正则表达式之Pattern与Matcher类详解

    Pattern.split方法详解 /** * 测试Pattern.split方法 */ @Test public void testPatternSplit() { String str = "{0x40, 0x11, 0x00, 0x00}"; // 分割符为:逗号, {,}, 空白符 String regex = "[,\\{\\}\\s]"; Pattern pattern = Pattern.compile(regex); /* * 1. split 方法

  • Java正则相关的Pattern和Matcher类及遇到的坑

    此篇文章是记录我在学习Java正则表达式时候学到的和遇到的坑. 先来说说 Matcher 里面的三个方法(取的结果以group()方法为例子) matches():整个匹配,只有整个字符序列完全匹配成功,才返回True,否则返回False.但如果前部分匹配成功,将移动下次匹配的位置.举个例子如果字符串为"a123",正则表达式为"\w\d\d\d",则matches()方法才返回true,换言之,就是要匹配的字符串需要跟正则表达式一一对应,字母对应字母,数字对应数字

  • 如何在Java中使用正则表达式API

    目录 Java正则表达式包 简单的例子 Meta Characters元字符 Character类 OR NOR Range类 Union类 Intersection类 Subtraction类 前言: 在正则表达式的世界中,有许多不同的风格可供选择,比如grep.Perl.Python.PHP.awk等等.这意味着在一种编程语言中工作的正则表达式可能在另一种编程语言中不工作.Java中的正则表达式语法与Perl中的最相似.要在Java中使用正则表达式,我们不需要任何特殊设置.JDK包含一个特殊

  • Java正则表达式API字符类

    目录 一.Predefined字符类 二.Quantifiers 三.Capturing Groups 一.Predefined字符类 Java正则表达式API也接受预定义的字符类.上面的一些字符类可以用更短的形式表示,尽管这会降低代码的直观性.这个正则表达式的Java版本的一个特殊方面是转义字符. 正如我们将看到的,大多数字符都以反斜杠开头,这在Java中有特殊的意义.对于要由模式类编译的这些,必须转义前导反斜杠,即.\d变为\\d. 匹配的数字,相当于[0-9]: @Test public

  • Java正则表达式API边界匹配

    目录 Boundary Matchers Pattern Class Methods Pattern.CANON_EQ Pattern.CASE_INSENSITIVE Pattern.COMMENTS Boundary Matchers Java regex API还支持边界匹配.如果我们关心在输入文本中匹配的确切位置,那么这就是我们要寻找的.在前面的示例中,我们关心的只是是否找到匹配项. 为了仅在文本开头所需的正则表达式为true时匹配,我们使用插入符号^. 此测试将失败,因为可以在开头找到

  • Java API学习教程之正则表达式详解

    前言 正则表达式是什么应该不用过多介绍,每位程序员应该都知道,正则表达式描述的是一种规则,符合这种限定规则的字符串我们认为它某种满足条件的,是我们所需的.在正则表达式中,主要有两种字符,一种描述的是普通的字符,另一种描述的是元字符.其中元字符是整个正则表达式的核心,并由它完成规则的制定工作. 本篇文章主要从Java这门程序设计语言的角度理解正则表达式的应用,主要涉及以下内容: •基本正则表达式的理论基础 •Java中用于正则表达式匹配的类 •几种常用的正则表达式使用实例 一.正则表达式的理论基础

  • Java matches类,Pattern类及matcher类用法示例

    本文实例讲述了Java matches类,Pattern类及matcher类用法.分享给大家供大家参考,具体如下: Pattern类 正则表达式常见规则 A:字符     x 字符 x.举例:'a'表示字符a     \\ 反斜线字符.     \n 新行(换行)符 ('\u000A')     \r 回车符 ('\u000D') B:字符类     [abc] a.b 或 c(简单类),其中一个     [^abc] 任何字符,除了 a.b 或 c(否定)     [a-zA-Z] a到 z

  • 详解Java正则表达式中Pattern类和Matcher类

    前言 本文将介绍Java正则表达式中的Pattern类与Matcher类.首先我们要清楚指定为字符串的正则表达式必须首先被编译为pattern类的实例.因此如何更好的了解这两个类,是编程人员必须知道的. 以下我们就分别来看看这两个类: 一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式 ((A)(B(C)))中,存在四个这样的组: 1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C) 组零始终代表整个表达式. 以 (?) 开头的组是纯的

  • Java正则表达式API Matcher类方法

    目录 一.Pattern.DOTALL 二.Pattern.LITERAL 三.Pattern.MULTILINE 四.Matcher类方法 索引方法 Study方法 Replacement方法 一.Pattern.DOTALL 默认情况下,当我们使用“.”时表达式中,我们将匹配输入字符串中的每个字符,直到遇到新行字符. 使用此标志,匹配也将包括行终止符.我们将通过以下示例更好地理解.这些例子将略有不同.由于我们感兴趣的是针对匹配的字符串进行断言,因此我们将使用matcher的group方法来返

  • Java正则表达式Pattern和Matcher原理详解

    这篇文章主要介绍了Java正则表达式Pattern和Matcher原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 基本使用 Scanner中的使用正则表达式 //Scanner 支持的分组 Scanner cin=new Scanner("red a bbc").useDelimiter("\\s*a\\s*"); System.out.println(cin.next()); System.out.pri

  • Java 正则表达式学习总结和一些小例子

    从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础工具,可以用于很多类型的文本处理, 如匹配,搜索,提取和分析结构化内容. java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher. Pattern是一个正则表达式经编译后的表现模式. 在java中,通过适当命名的Pattern类可以容易确定String是否匹配某种模式.模式可以象匹配某个特定的String那样简单

  • Java正则表达式入门学习

    许多语言,包括Perl.PHP.Python.JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级"搜索-替换"功能.所以JAVA语言也不例外.正则表达式已经超出了某种语言或某个系统的局限,成为被人们广为使用的工具,我们完全可以用它来解决实际开发中碰到的一些实际的问题. 一.正则表达式基础知识 1.1 句点符号 假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以"t"字母开头,以"n"

  • JAVA 正则表达式陈广佳版本(超详细)

    在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式.正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性.在Unix世界里,正则表达式几乎没有什么限制,可肯定的是,它应用非常之广泛. 正则表达式的引擎已被许多普通的Unix工具所实现,包括grep,awk,vi和Emacs等.此外,许多使用比较广泛

随机推荐