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 正则表达式 - 捕获组

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

捕获组按从左到右的开括号顺序编号。例如,在表达式 `((A)(B(C)))` 中,有四个这样的组:

  • ((A)(B(C)))
  • (A)
  • (B(C))
  • (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 int end()

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

2 int end(int group)

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

3 String group()

返回上次匹配匹配的输入子序列。

4 String group(int group)

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

5 int groupCount()

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

6 int start()

返回匹配的起始索引。

7 int start(int group)

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

Java 正则表达式 - Pattern 类

介绍

`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 static Pattern compile(String regex)

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

2 static Pattern compile(String regex, int flags)

使用给定的标志将给定的正则表达式编译成模式。

3 int flags()

返回此模式的匹配标志。

4 Matcher matcher(CharSequence input)

创建一个匹配器,它将使用此模式匹配给定的输入。

5 static boolean matches(String regex, CharSequence input)

编译给定的正则表达式并尝试使用它匹配给定的输入。

6 String pattern()

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

7 static String quote(String s)

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

8 String[] split(CharSequence input)

根据此模式的匹配项拆分给定的输入序列。

9 String[] split(CharSequence input, int limit)

根据此模式的匹配项拆分给定的输入序列。

10 String toString()

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

继承的方法

此类继承自以下类的方法:

  • java.lang.Object

Java 正则表达式 - Matcher 类

介绍

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

类声明

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

public final class Matcher
   extends Object
      implements MatchResult

类方法

序号 方法和描述
1 Matcher appendReplacement(StringBuffer sb, String replacement)

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

2 StringBuffer appendTail(StringBuffer sb)

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

3 int end()

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

4 int end(int group)

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

5 boolean find()

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

6 boolean find(int start)

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

7 String group()

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

8 String group(String name)

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

9 int groupCount()

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

10 boolean hasAnchoringBounds()

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

11 boolean hasTransparentBounds()

查询此匹配器的区域边界的透明性。

12 boolean hitEnd()

如果上次此匹配器执行的匹配操作中搜索引擎命中输入的结尾,则返回 true。

13 boolean lookingAt()

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

14 boolean matches()

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

15 Pattern pattern()

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

16 static String quoteReplacement(String s)

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

17 Matcher region(int start, int end)

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

18 int regionEnd()

报告此匹配器的区域的结束索引(独占)。

19 int regionStart()

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

20 String replaceAll(String replacement)

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

21 String replaceFirst(String replacement)

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

22 boolean requireEnd()

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

23 Matcher reset()

重置此匹配器。

24 Matcher reset(CharSequence input)

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

25 int start()

返回上次匹配的起始索引。

26 int start(int group)

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

27 MatchResult toMatchResult()

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

28 String toString()

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

29 Matcher useAnchoringBounds(boolean b)

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

30 Matcher usePattern(Pattern newPattern)

更改此 Matcher 用于查找匹配项的 Pattern。

31 Matcher useTransparentBounds(boolean b)

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

继承的方法

此类继承自以下类的方法:

  • java.lang.Object

Java 正则表达式 - PatternSyntaxException 类

介绍

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

类声明

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

public class PatternSyntaxException
   extends IllegalArgumentException

构造函数

序号 方法和描述
1 PatternSyntaxException(String desc, String regex, int index)

构造此类的新的实例。

类方法

序号 方法和描述
1 String getDescription()

检索错误的描述。

2 int getIndex()

获取错误索引。

3 String getMessage()

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

4 String 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 \uhhhh

十六进制值为 0xhhhh 的字符

8 \t

制表符 ('\u0009')

9 \n

换行符(换行符)字符 ('\u000A')

10 \r

回车符 ('\u000D')

11 \f

换页符 ('\u000C')

Java 正则表达式 - 字符类匹配

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

序号 构造 & 匹配
1 [abc]

a、b 或 c(简单类)。

2 [^abc]

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

3 [a-zA-Z]

a 到 z 或 A 到 Z,包括在内(范围)。

4 [a-d[m-p]]

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

5 [a-z&&[def]]

d、e 或 f(交集)。

6 [a-z&&[^bc]]

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

7 [a-z&&[^m-p]]

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{Lower}

一个小写字母字符:[a-z]。

2 \p{Upper}

一个大写字母字符:[A-Z]。

3 \p{ASCII}

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

4 \p{Alpha}

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

5 \p{Digit}

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

6 \p{Alnum}

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

7 \p{Punct}

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

8 \p{Graph}

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

9 \p{Print}

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

10 \p{Blank}

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

11 \p{XDigit}

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

12 \p{Space}

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

匹配 JAVA 字符类

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

序号 构造 & 匹配
1 \p{javaLowerCase}

等效于 java.lang.Character.isLowerCase()。

2 \p{javaUpperCase}

等效于 java.lang.Character.isUpperCase()。

3 \p{javaWhitespace}

等效于 java.lang.Character.isWhitespace()。

4 \p{javaMirrored}

等效于 java.lang.Character.isMirrored()。

匹配 Unicode 字符类

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

序号 构造 & 匹配
1 \p{IsLatin}

一个拉丁文字符。

2 \p{InGreek}

希腊字母块中的一个字符。

3 \p{Lu}

一个大写字母。

4 \p{IsAlphabetic}

一个字母字符(二元属性)。

5 \p{Sc}

一个货币符号。

6 \P{InGreek}

除希腊字母块中的字符以外的任何字符。

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 中的正则表达式进行勉强量词匹配的各种示例。

序号 构造 & 匹配
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。

打印
广告