Java 正则表达式 - 快速指南


Java 正则表达式 - 概述

Java 提供了 java.util.regex 包用于与正则表达式进行模式匹配。Java正则表达式与Perl编程语言非常相似并且非常容易学习。

正则表达式是一种特殊的字符序列,可帮助您使用模式中保存的专用语法来匹配或查找其他字符串或字符串集。它们可用于搜索、编辑或操作文本和数据。

java.util.regex 包主要包含以下三个类 -

  • Pattern 类- Pattern 对象是正则表达式的编译表示。Pattern 类不提供公共构造函数。要创建模式,必须首先调用其公共静态compile()方法之一,然后该方法将返回Pattern 对象。这些方法接受正则表达式作为第一个参数。

  • Matcher 类- Matcher 对象是解释模式并对输入字符串执行匹配操作的引擎。与 Pattern 类一样,Matcher 没有定义公共构造函数。您可以通过调用Pattern 对象的matcher()方法来获取 Matcher 对象。

  • PatternSyntaxException - PatternSyntaxException 对象是一个未经检查的异常,指示正则表达式模式中的语法错误。

Java Regex - 捕获组

捕获组是将多个字符视为一个单元的一种方法。它们是通过将要分组的字符放在一组括号内来创建的。例如,正则表达式 (dog) 创建一个包含字母“d”、“o”和“g”的组。

捕获组通过从左到右数其左括号来编号。例如,在表达式 ((A)(B(C))) 中,有四个这样的组 -

  • ((A)(B(C)))
  • (A)
  • (公元前))
  • (C)

要了解表达式中存在多少个组,请调用匹配器对象的 groupCount 方法。groupCount 方法返回一个int,显示匹配器模式中存在的捕获组的数量。

还有一个特殊的组,组 0,它始终代表整个表达式。该组不包含在 groupCount 报告的总数中。

例子

以下示例说明如何从给定的字母数字字符串中查找数字字符串 -

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {
   public static void main( String args[] ) {
      // String to be scanned to find the pattern.
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);
      
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      } else {
         System.out.println("NO MATCH");
      }
   }
}

这将产生以下结果 -

输出

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

Java 正则表达式 - MatchResult 接口

介绍

java.util.regex.MatchResult接口表示匹配操作结果。该接口包含用于确定与正则表达式匹配的结果的查询方法。通过 MatchResult 可以看到但不能修改匹配边界、组和组边界。

接口声明

以下是java.util.regex.MatchResult接口的声明-

public interface MatchResult

接口方法

先生编号 方法及说明
1 打算()

返回最后一个匹配字符之后的偏移量。

2 int 结束(int 组)

返回在本次匹配期间给定组捕获的子序列的最后一个字符之后的偏移量。

3 字符串组()

返回与前一个匹配项匹配的输入子序列。

4 字符串组(int组)

返回给定组在上一次匹配操作期间捕获的输入子序列。

5 int 组计数()

返回此匹配结果模式中的捕获组的数量。

6 int 开始()

返回匹配的开始索引。

7 int 开始(int 组)

返回给定组在本次匹配期间捕获的子序列的起始索引。

Java 正则表达式 - 模式类

介绍

java.util.regex.Pattern类表示正则表达式的编译表示。

类声明

以下是java.util.regex.Pattern类的声明-

public final class Pattern
   extends Object
      implements Serializable

场地

以下是java.util.regex.Duration类的字段-

  • static int CANON_EQ - 启用规范等效。

  • static int CASE_INSENSITIVE - 启用不区分大小写的匹配。

  • static int COMMENTS - 允许模式中的空格和注释。

  • static int DOTALL - 启用 dotall 模式。

  • static int LITERAL - 启用模式的文字解析。

  • static int MULTILINE - 启用多行模式。

  • static int UNICODE_CASE - 启用 Unicode 感知大小写折叠。

  • static int UNICODE_CHARACTER_CLASS - 启用预定义字符类和 POSIX 字符类的 Unicode 版本。

  • static int UNIX_LINES - 启用 Unix 线路模式。

类方法

先生编号 方法及说明
1 静态模式编译(字符串正则表达式)

将给定的正则表达式编译为模式。

2 静态模式编译(字符串正则表达式,int 标志)

将给定的正则表达式编译为具有给定标志的模式。

3 int 标志()

返回此模式的匹配标志。

4 Matcher匹配器(CharSequence输入)

创建一个匹配器,将给定的输入与此模式进行匹配。

5 静态布尔匹配(字符串正则表达式,CharSequence 输入)

编译给定的正则表达式并尝试将给定的输入与其进行匹配。

6 字符串模式()

返回编译此模式的正则表达式。

7 静态字符串引用(String s)

返回指定字符串的文字模式字符串。

8 String[] split(CharSequence 输入)

围绕此模式的匹配拆分给定的输入序列。

9 String[] split(CharSequence 输入,int limit)

围绕此模式的匹配拆分给定的输入序列。

10 字符串转字符串()

返回此模式的字符串表示形式。

继承的方法

该类继承了以下类的方法 -

  • Java.lang.Object

Java 正则表达式 - 匹配器类

介绍

java.util.regex.Matcher类充当引擎,通过解释模式对字符序列执行匹配操作。

类声明

以下是java.util.regex.Matcher类的声明-

public final class Matcher
   extends Object
      implements MatchResult

类方法

先生编号 方法及说明
1 匹配器appendReplacement(StringBuffer sb,字符串替换)

实现非终止附加和替换步骤。

2 StringBuffer appendTail(StringBuffer sb)

实现终端追加和替换步骤。

3 打算()

返回最后一个匹配字符之后的偏移量。

4 int 结束(int 组)

返回在上一次匹配操作期间给定组捕获的子序列的最后一个字符之后的偏移量。

5 布尔查找()

尝试查找输入序列中与模式匹配的下一个子序列。

6 布尔查找(int start)

重置此匹配器,然后尝试从指定索引处开始查找与模式匹配的输入序列的下一个子序列。

7 字符串组()

返回给定组在上一次匹配操作期间捕获的输入子序列。

8 字符串组(字符串名称)

返回给定命名捕获组在上一个匹配操作期间捕获的输入子序列。

9 int 组计数()

返回此匹配器模式中捕获组的数量。

10 布尔值 h​​asAnchoringBounds()

查询该匹配器的区域边界锚定。

11 布尔值 h​​asTransparentBounds()

查询该匹配器的区域边界的透明度。

12 布尔型 hitEnd()

如果搜索引擎在此匹配器执行的最后一次匹配操作中命中了输入末尾,则返回 true。

13 布尔值lookingAt()

尝试从区域的开头开始与模式匹配输入序列。

14 布尔匹配()

尝试将整个区域与模式进行匹配。

15 模式 模式()

返回此匹配器解释的模式。

16 静态字符串 quoteReplacement(String s)

返回指定字符串的文字替换字符串。

17 号 匹配器区域(int start, int end)

设置此匹配器区域的限制。

18 int 区域结束()

报告此匹配器区域的结束索引(不包括)。

19 int 区域开始()

报告该匹配器区域的起始索引。

20 字符串替换全部(字符串替换)

用给定的替换字符串替换与模式匹配的输入序列的每个子序列。

21 字符串replaceFirst(字符串替换)

用给定的替换字符串替换与模式匹配的输入序列的第一个子序列。

22 布尔值 requireEnd()

如果更多输入可以将正匹配更改为负匹配,则返回 true。

23 匹配器重置()

重置此匹配器。

24 匹配器重置(CharSequence 输入)

使用新的输入序列重置此匹配器。

25 int 开始()

返回上一场比赛的开始索引。

26 int 开始(int 组)

返回给定组在上一次匹配操作期间捕获的子序列的起始索引。

27 匹配结果到匹配结果()

返回此匹配器的匹配状态作为 MatchResult。

28 字符串转字符串()

返回此匹配器的字符串表示形式。

29 匹配器 useAnchoringBounds(boolean b)

设置此匹配器的区域边界的锚定。

30 匹配器 usePattern(Pattern newPattern)

更改此匹配器用于查找匹配项的模式。

31 匹配器 useTransparentBounds(boolean b)

设置此匹配器区域边界的透明度。

继承的方法

该类继承了以下类的方法 -

  • Java.lang.Object

Java 正则表达式 - PatternSyntaxException 类

介绍

java.util.regex.PatternSyntaxException类表示抛出的未经检查的异常,以指示正则表达式模式中的语法错误

类声明

以下是java.util.regex.PatternSyntaxException类的声明-

public class PatternSyntaxException
   extends IllegalArgumentException

构造函数

先生编号 方法及说明
1 PatternSyntaxException(字符串 desc、字符串正则表达式、int 索引)

构造该类的一个新实例。

类方法

先生编号 方法及说明
1 字符串 getDescription()

检索错误的描述。

2 int getIndex()

检索错误索引。

3 字符串 getMessage()

返回一个多行字符串,其中包含语法错误及其索引的描述、错误的正则表达式模式以及模式内错误索引的可视指示。

4 字符串 getPattern()

检索错误的正则表达式模式。

继承的方法

该类继承了以下类的方法 -

  • Java.lang.Throwable
  • Java.lang.Object

例子

以下示例显示 java.util.regex.Pattern.PatternSyntaxException 类方法的用法。

package com.tutorialspoint;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class PatternSyntaxExceptionDemo {
   private static String REGEX = "[";
   private static String INPUT = "The dog says meow " + "All dogs say meow.";
   private static String REPLACE = "cat";

   public static void main(String[] args) {
      try{
         Pattern pattern = Pattern.compile(REGEX);
         
         // get a matcher object
         Matcher matcher = pattern.matcher(INPUT); 
         INPUT = matcher.replaceAll(REPLACE);
      } catch(PatternSyntaxException e){
         System.out.println("PatternSyntaxException: ");
         System.out.println("Description: "+ e.getDescription());
         System.out.println("Index: "+ e.getIndex());
         System.out.println("Message: "+ e.getMessage());
         System.out.println("Pattern: "+ e.getPattern());
      }
   }
}

让我们编译并运行上面的程序,这将产生以下结果 -

PatternSyntaxException: 
Description: Unclosed character class
Index: 0
Message: Unclosed character class near index 0
[
^
Pattern: [

Java 正则表达式 - 匹配字符的示例

下面是在java中使用正则表达式匹配字符的各种示例。

先生编号 构建与匹配
1 X

字符 x

2 \\

反斜杠字符

3 \0n

八进制值为 0n (0 ≤ n ≤ 7) 的字符

4 \0nn

八进制值为 0nn (0 ≤ n ≤ 7) 的字符

5 \0mnn

八进制值为 0mnn 的字符 (0 ≤ m ≤ 3, 0 ≤ n ≤ 7)

6 \xhh

十六进制值为0xhh的字符

7 \呃呃

十六进制值为0xhhhh的字符

8 \t

制表符 ('\u0009')

9 \n

换行符 ('\u000A')

10 \r

回车符 ('\u000D')

11 \F

换页符 ('\u000C')

Java Regex - 匹配字符类

下面是在java中使用正则表达式匹配字符类的各种示例。

先生编号 构建与匹配
1 [ABC]

a、b 或 c(简单类)。

2 [^abc]

除 a、b 或 c(否定)之外的任何字符。

3 [a-zA-Z]

a 到 z 或 A 到 Z,包括边界值(范围)。

4 [广告[mp]]

a 到 d,或 m 到 p:[a-dm-p](并集)。

5 [az&&[def]]

d、e 或 f(交集)。

6 [az&&[^bc]]

a 到 z,b 和 c 除外:[ad-z](减法)

7 [az&&[^mp]]

a 到 z,而不是 m 到 p:[a-lq-z](减法)。

匹配预定义字符类

以下是在 java 中使用正则表达式匹配预定义字符类的各种示例。

先生编号 构建与匹配
1

任何字符(可能匹配也可能不匹配行终止符)。

2 \d

数字:[0-9]。

3 \D

非数字:[^0-9]。

4 \s

空白字符:[ \t\n\x0B\f\r]

5 \S

非空白字符:[^\s]。

6 \w

单词字符:[a-zA-Z_0-9]。

7 \W

非单词字符:[^\w]

匹配 POSIX 字符类

以下是在 java 中使用正则表达式匹配 POSIX 字符类的各种示例。

先生编号 构建与匹配
1 \p{降低}

小写字母字符:[az]。

2 \p{上}

大写字母字符:[AZ]。

3 \p{ASCII}

所有 ASCII:[\x00-\x7F]。

4 \p{阿尔法}

字母字符:[\p{Lower}\p{Upper}]。

5 \p{数字}

十进制数字:[0-9]。

6 \p{Alnum}

字母数字字符:[\p{Alpha}\p{Digit}]。

7 \p{标点}

标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_>{|}< 之一。

8 \p{图}

可见字符:[\p{Alnum}\p{Punct}]。

9 \p{打印}

可打印字符:[\p{Graph}\x20]。

10 \p{空白}

空格或制表符:[ \t]。

11 \p{X数字}

十六进制数字:[0-9a-fA-F]。

12 \p{空格}

空白字符:[ \t\n\x0B\f\r]。

匹配JAVA字符类

下面是在java中使用正则表达式匹配JAVA字符类的各种示例。

先生编号 构建与匹配
1 \p{javaLowerCase}

相当于java.lang.Character.isLowerCase()。

2 \p{javaUpperCase}

相当于java.lang.Character.isUpperCase()。

3 \p{java空白}

相当于java.lang.Character.isWhitespace()。

4 \p{java镜像}

相当于java.lang.Character.isMirrored()。

匹配 Unicode 字符类

以下是在 java 中使用正则表达式匹配 Unicode 字符类的各种示例。

先生编号 构建与匹配
1 \p{是拉丁语}

拉丁文字字符。

2 \p{希腊语}

希腊方块中的一个角色。

3 \p{卢}

一个大写字母。

4 \p{按字母顺序}

字母字符(二进制属性)。

5 \p{Sc}

货币符号。

6 \P{希腊语}

除希腊语块中的一个字符外的任何字符。

7 [\p{L}&&[^\p{Lu}]]

除大写字母外的任何字母。

边界匹配器的示例

以下是在 java 中使用正则表达式的边界匹配器的各种示例。

先生编号 构建与匹配
1 ^

一行的开头。

2 $

一行的末尾。

3 \b

一个词的边界。

4 \B

非单词边界。

5 \A

输入的开始。

6 \G

上一场比赛结束。

7 \Z

输入的结尾,但最后的终止符(如果有)。

8 \z

输入结束。

贪婪量词的 Java 正则表达式

贪婪量词指示搜索引擎搜索整个字符串并检查它是否与给定的正则表达式匹配。以下是在 java 中使用正则表达式的贪婪量词的各种示例。

先生编号 构建与匹配
1 X?

X,一次或根本不。

2 X*

X,零次或多次

3 X+

X,一次或多次。

4 X{n}

X,正好n次。

5 X{n,}

X,至少n次。

6 X{n,m}

X,至少n次但不超过m次

不情愿的量词的例子

不情愿的量词指示搜索引擎从字符串中尽可能短的部分开始。一旦找到匹配,引擎继续;否则,它会向正在检查的字符串部分添加一个字符并进行搜索,依此类推。此过程一直持续到找到匹配项或整个字符串已用完为止。以下是在 java 中使用正则表达式的 Reluctant 量词的各种示例。

先生编号 构建与匹配
1 X??

X,一次或根本不。

2 X*?

X,零次或多次

3 X+?

X,一次或多次。

4 X{n}?

X,正好n次。

5 X{n,}?

X,至少n次。

6 X{n,m}?

X,至少n次但不超过m次

所有格量词的例子

所有格量词与贪婪量词类似。它通过检查整个字符串来指示引擎启动。如果它不起作用,如果匹配失败并且没有回溯,则在某种意义上是不同的。以下是在 java 中使用正则表达式的所有格量词的各种示例。

先生编号 构建与匹配
1 X?+

X,一次或根本不。

2 X*+

X,零次或多次

3 X++

X,一次或多次。

4 X{n}+

X,正好n次。

5 X{n,}+

X,至少n次。

6 X{n,m}+

X,至少n次但不超过m次

Java 正则表达式 - 逻辑运算符示例

以下是在 java 中使用正则表达式的逻辑运算符的各种示例。

先生编号 构建与匹配
1 XY

X 随后是 Y。

2 X|Y

X 或 Y。

打印