Java正则表达式API字符类

目录
  • 一、Predefined字符类
  • 二、Quantifiers
  • 三、Capturing Groups

一、Predefined字符类

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

二、Quantifiers

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

三、Capturing Groups

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正则表达式 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

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

  • Java字符串 正则表达式详解

    目录 一.规则表 1.字符 2.字符类 . 3.边界匹配符 4.逻辑操作符 5.量词 二.Pattern类 1.Pattern类的实例获取-compile方法 2.split方法 3.Pattern中匹配标记参数 三.Matcher类 总结 在日常Java后端开发过程中,免不了对数据字段的解析,自然就少不了对字符串的操作,这其中就包含了正则表达式这一块的内容,这里面涉及Java包中Pattern类和Macher类,本篇博客就针对这一块内容和常见的用法进行总结,本博客主要的参考资料是<Java编程

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

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

  • Java正则表达式的基本用法和实例大全

    目录 一.概述: 二.单个符号 三.快捷符号 四.常用的正则表达式 五.Java中正则表达式的应用 1.判断功能 2.分割功能 3.替换功能 六.常用正则表达式 七.实例 总结 一.概述: 用来描述或者匹配一系列符合某个语句规则的字符串 二.单个符号 1.英文句点.符号:匹配单个任意字符. 表达式t.o 可以匹配:tno,t#o,teo等等.不可以匹配:tnno,to,Tno,t正o等. 2.中括号[]:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符. 表达式:t[abcd]n 只可以匹

  • java如何使用正则表达式限制特殊字符的个数

    目录 使用正则表达式限制特殊字符的个数 java判断限定字符的正则 使用正则表达式限制特殊字符的个数 package com.l.dubbo.service; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ThreadPoolTest { public static boolean check1

  • Java正则表达式循环匹配字符串方式

    目录 正则表达式循环匹配字符串 Java匹配正则表达式大全 我们先举个例子来看看Java匹配正则表达式 匹配表达式的特殊情况 正则表达式循环匹配字符串 public static void main(String[] args) { /** * String str = "[Part 'name=1234567']"; */ String targetStr = "where 1=1 [and user_name like '%$user_name$%'] [and comp

  • Java正则表达式之Pattern类实例详解

    目录 前言 Pattern 概述 Pattern 匹配模式(Pattern flags) 代码示例 多行模式:Pattern.MULTILINE 示例 忽略大小写:Pattern.CASE_INSENSITIVE 示例 启用注释:Pattern.COMMENTS 示例 启用 dotall 模式:Pattern.DOTALL 示例 平白字符模式 模式:Pattern.LITERAL 示例 附:贪婪匹配与懒惰匹配 总结 前言 这个系列的文章我们使用以下的顺序进行讲解: Pattern 详解: Mat

  • 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 Matcher类方法

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

  • Java正则表达式提取字符的方法实例

    正好遇到一个需求需要将字符串中特定的字符全部提取出来,这个如果是按常规的字符串处理的话非常的繁琐.于是想到用正则表达式来完成.项目需求是这样的:需要提取车牌号中最后一个数字,比如说:苏A7865提取5,苏A876X提取6 实现方法: import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { String s

  • 常用java正则表达式的工具类

    本文实例为大家分享了java正则表达式工具类的具体代码,供大家参考,具体内容如下 import com.google.common.base.Strings; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 常用的正则表达式 * Created by tookbra on 2016/4/7. */ public class RegexUtils { /** * 判断是否是正确的IP地址 * * @para

  • Java正则表达式匹配字符串并提取中间值的方法实例

    目录 前言 场景一:提取SAML2报文 解析 场景2:提取sql中的表名和字段 总结 前言 有时候正则表达式不只是匹配一下什么数字/邮箱/身份证/日期等等,还需要匹配某一段文字,并按照既定格式提取其中的某些值. 场景一:提取SAML2报文 SAML2报文内容如下,从中提取对应的attribute name和value. <saml:AttributeStatement> <saml:Attribute Name="mail"> <saml:Attribut

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

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

  • java正则表达式验证工具类

    分享一个用正则表达式校验电话号码.身份证号.日期格式.URL.Email等等格式的工具类 复制代码 代码如下: package com.eabax.util; import java.util.regex.Matcher;  import java.util.regex.Pattern;  /**  * 验证工具类  * @author admin  *  */ public class Validation {      //------------------常量定义      /**   

随机推荐