模块 java.base

类 Pattern

java.lang.Object
java.util.regex.Pattern
所有已实现的接口:
Serializable

public final class Pattern extends Object implements Serializable
正则表达式的编译表示。

指定为字符串的正则表达式必须首先编译为此类的实例。然后,生成的模式可用于创建一个 Matcher 对象,该对象可以将任意 字符序列 与正则表达式匹配。执行匹配所涉及的所有状态都驻留在匹配器中,因此许多匹配器可以共享相同的模式。

因此,典型的调用顺序是

 Pattern p = Pattern.compile ("a*b");
 Matcher m = p.matcher ("aaaaab");
 boolean b = m.matches ();

此类定义了一个 matches 方法,以便在仅使用一次正则表达式时使用。此方法编译一个表达式,并在一次调用中将输入序列与其匹配。该声明

 boolean b = Pattern.matches("a*b", "aaaaab");
等同于上面的三个语句,尽管对于重复匹配它效率较低,因为它不允许重用已编译的模式。

此类的实例是不可变的,可以安全地供多个并发线程使用。 Matcher 类的实例不能安全地用于此类用途。

正则表达式结构总结

正则表达式构造,以及它们匹配的内容
构造 火柴
Characters
x 人物x
\\ 反斜杠字符
\0 n 八进制值为0的字符n(0 <=n<= 7)
\0 nn 八进制值为0的字符nn(0 <=n<= 7)
\0 八进制值为0的字符(0 <=m<= 3、0 <=n<= 7)
\x 十六进制值的字符0x
\u 呵呵 十六进制值的字符0x呵呵
\x {h...h} 十六进制值的字符0x哈...哈(Character.MIN_CODE_POINT <= 0x哈...哈<= Character.MAX_CODE_POINT )
\N{ name} 具有 Unicode 字符名称的字符'姓名'
\t 制表符 ('\u0009')
\n 换行(换行)字符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 警报(响铃)字符 ('\u0007')
\e 转义符 ('\u001B')
\c x 对应的控制字符x
字符类
[abc] abc(简单类)
[^abc] abc (否定)之外的任何字符
[a-zA-Z] azAZ ,包括(范围)
[a-d[m-p]] ad,或 mp[a-dm-p](联合)
[a-z&&[def]] def (交叉路口)
[a-z&&[^bc]] az,除了 bc[ad-z](减法)
[a-z&&[^m-p]] az,而不是 mp[a-lq-z](减法)
预定义字符类
. 任何字符(可能匹配也可能不匹配 行终止符
\d 数字:[0-9] 如果未设置 * UNICODE_CHARACTER_CLASS。参见 Unicode支持
\D 非数字:[^0-9]
\h 水平空白字符:[ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]
\H 非水平空白字符:[^\h]
\s 空白字符:[ \t\n\x0B\f\r] 如果未设置 UNICODE_CHARACTER_CLASS。参见 Unicode支持
\S 非空白字符:[^\s]
\v 垂直空白字符:[\n\x0B\f\r\x85\u2028\u2029]
\V 非垂直空白字符:[^\v]
\w 单词字符:[a-zA-Z_0-9] 如果 UNICODE_CHARACTER_CLASS 未设置。参见 Unicode支持
\W 非单词字符:[^\w]
POSIX 字符类(仅限 US-ASCII)
\p{Lower} 小写字母字符:[a-z]
\p{Upper} 大写字母字符:[A-Z]
\p{ASCII} 所有 ASCII:[\x00-\x7F]
\p{Alpha} 字母字符:[\p{Lower}\p{Upper}]
\p{Digit} 十进制数:[0-9]
\p{Alnum} 字母数字字符:[\p{Alpha}\p{Digit}]
\p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~之一
\p{Graph} 可见字符:[\p{Alnum}\p{Punct}]
\p{Print} 可打印字符:[\p{Graph}\x20]
\p{Blank} 空格或制表符:[ \t]
\p{Cntrl} 控制字符:[\x00-\x1F\x7F]
\p{XDigit} 十六进制数字:[0-9a-fA-F]
\p{Space} 空白字符:[ \t\n\x0B\f\r]
java.lang.Character 类(简单的 java字符类型
\p{javaLowerCase} 等同于 java.lang.Character.isLowerCase()
\p{javaUpperCase} 等同于 java.lang.Character.isUpperCase()
\p{javaWhitespace} 等同于 java.lang.Character.isWhitespace()
\p{javaMirrored} 等同于 java.lang.Character.isMirrored()
Unicode 脚本、块、类别和二进制属性的类
\p{IsLatin} 拉丁脚本字符 (脚本)
\p{InGreek} 希腊语块中的一个字符 (block )
\p{Lu} 大写字母 (category)
\p{IsAlphabetic} 一个字母字符 (二元属性)
\p{Sc} 货币符号
\P{InGreek} 除希腊语块中的一个字符外的任何字符(否定)
[\p{L}&&[^\p{Lu}]] 除大写字母以外的任何字母(减法)
边界匹配器
^ 一行的开头
$ 一行的结尾
\b 单词边界:(?:(?<=\w)(?=\W)|(?<=\W)(?=\w))(非单词字符与单词字符相邻的位置)
\b{g} Unicode 扩展字形簇边界
\B 非单词边界:[^\b]
\A 输入的开头
\G 上一场比赛结束
\Z 输入的结尾,但对于最后的 终结者 ,如果有的话
\z 输入结束
换行匹配器
\R 任何 Unicode 换行序列,等同于 \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
Unicode 扩展字素匹配器
\X 任何 Unicode 扩展字素簇
贪心量词
X? X, 一次或根本没有
X* X, 零次或多次
X+ X, 一次或多次
X{ n} X, 确切地n
X{ n, } X, 至少n
X{ n, m} X, 至少n但不超过m
不情愿的量词
X?? X, 一次或根本没有
X*? X, 零次或多次
X+? X, 一次或多次
X{ n}? X, 确切地n
X{ n,}? X, 至少n
X{ n, m}? X, 至少n但不超过m
所有格量词
X?+ X, 一次或根本没有
X*+ X, 零次或多次
X++ X, 一次或多次
X{ n}+ X, 确切地n
X{ n,}+ X, 至少n
X{ n, m}+ X, 至少n但不超过m
逻辑运算符
XY X其次是Y
X| Y 任何一个X或者Y
( X) X,作为捕获组
反向引用
\ n 不管是什么n捕获组 匹配
\ k<name> 无论命名捕获组“名称”匹配
引述
\ 没什么,只是引用了后面的字符
\Q 什么都没有,但引用所有字符直到 \E
\E 什么都没有,但结束引用由 \Q 开始
特殊构造(命名捕获和非捕获)
(?<name> X) X, 作为命名捕获组
(?: X) X,作为一个非捕获组
(?idmsuxU-idmsuxU)  什么都没有,但打开匹配标志 i d m s u x U
(?idmsuxU-idmsuxU: X)    X, 作为具有给定标志的 非捕获组 i d m s u x U on - off
(?= X) X,通过零宽度正前瞻
(?! X) X,通过零宽度负先行
(?<= X) X, 通过零宽度正后视
(?<! X) X, 通过零宽度负后视
(?> X) X,作为一个独立的非捕获组

反斜杠、转义和引用

反斜杠字符 ('\') 用于引入转义结构,如上表所定义,以及引用否则将被解释为非转义结构的字符。因此,表达式 \\ 匹配单个反斜杠,而 \{ 匹配左大括号。

在任何不表示转义构造的字母字符之前使用反斜杠是错误的;这些是为将来对正则表达式语言的扩展保留的。可以在非字母字符之前使用反斜杠,而不管该字符是否是未转义构造的一部分。

Java 源代码中字符串文字中的反斜杠按要求解释Java 语言规范作为 Unicode 转义(3.3 节)或其他字符转义(3.10.6 节)。因此,有必要在表示正则表达式的字符串文字中加双反斜杠,以保护它们不被 Java 字节码编译器解释。例如,字符串文字 "\b" 在解释为正则表达式时匹配单个退格字符,而 "\\b" 匹配单词边界。字符串文字 "\(hello\)" 是非法的,会导致编译时错误;为了匹配字符串 (hello),必须使用字符串文字 "\\(hello\\)"

字符类

字符类可能出现在其他字符类中,并且可能由联合运算符(隐式)和交集运算符(&&)组成。联合运算符表示一个类,该类包含至少在其操作数类之一中的每个字符。交集运算符表示一个类,该类包含其两个操作数类中的每个字符。

字符类运算符的优先级如下,从高到低:

字符类运算符的优先级。
优先级 Name 示例
1 文字逃逸 \x
2 Grouping [...]
3 Range a-z
4 联盟 [a-e][i-u]
5 路口 [a-z&&[aeiou]]

请注意,一组不同的元字符在字符类内部和字符类外部有效。例如,正则表达式 . 在字符类中失去了它的特殊含义,而表达式 - 变成了一个范围形成元字符。

行终止符

A 行终止符是一个或两个字符的序列,它标记输入字符序列的一行的结尾。以下内容被识别为行终止符:

  • 换行(换行)字符('\n'),
  • 一个回车符紧跟一个换行符("\r\n"),
  • 一个独立的回车符('\r'),
  • 下一行字符('\u0085'),
  • 行分隔符 ('\u2028'),或
  • 段落分隔符 ('\u2029')。

如果 UNIX_LINES 模式被激活,那么唯一识别的行终止符是换行符。

正则表达式 . 匹配除行终止符以外的任何字符,除非指定了 DOTALL 标志。

如果未激活 MULTILINE 模式,则正则表达式 ^ 会忽略行终止符并且仅匹配整个输入序列的开头。正则表达式 $ 匹配整个输入序列的末尾,但如果后面没有任何其他输入字符,也会匹配最后一行终止符之前的位置。其他行终止符将被忽略,包括最后一个,如果它后面是其他输入字符。

如果 MULTILINE 模式被激活,那么 ^ 匹配输入的开头和除输入结尾之外的任何行终止符之后。在 MULTILINE 模式下,$ 匹配行终止符之前或输入序列的结尾。

分组和捕获

群号

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

  1. ((A)(B(C)))
  2. (A)
  3. (B(C))
  4. (C)

组零始终代表整个表达式。

捕获组之所以如此命名,是因为在匹配过程中,匹配此类组的输入序列的每个子序列都会被保存。捕获的子序列稍后可以通过反向引用在表达式中使用,也可以在匹配操作完成后从匹配器中检索。

团队名字

捕获组也可以分配一个“名称”,一个 named-capturing group ,然后稍后由“名称”反向引用。组名由以下字符组成。第一个字符必须是 letter

  • 大写字母 'A''Z''\u0041''\u005a'),
  • 小写字母 'a''z''\u0061''\u007a'),
  • 数字 '0''9''\u0030''\u0039'),

named-capturing group 仍按照 群号 中的描述进行编号。

与组关联的捕获输入始终是该组最近匹配的子序列。如果一个组因为量化而被第二次评估,那么如果第二次评估失败,则其先前捕获的值(如果有)将被保留。例如,将字符串 "aba" 与表达式 (a(b)?)+ 进行匹配,将第二组设置为 "b"。所有捕获的输入都在每次匹配开始时被丢弃。

(? 开头的组要么是纯的,非捕获不捕获文本且不计入组总数的组,或命名捕获团体。

Unicode 支持

此类符合 Unicode 技术标准 #18:Unicode 正则表达式 的级别 1,以及 RL2.1 规范等效项和 RL2.2 扩展字素簇。

Unicode 转义序列如 Java 源代码中的 \u2014 按照 3.3 部分中的描述进行处理Java 语言规范.这样的转义序列也直接由正则表达式解析器实现,因此 Unicode 转义可以用于从文件或键盘读取的表达式中。因此,字符串 "\u2014""\\u2014" 虽然不相等,但编译成相同的模式,匹配具有十六进制值 0x2014 的字符。

一个 Unicode 字符也可以用它的十六进制表示法(十六进制代码点值)直接如构造 \x{...} 中所述,例如补充字符 U+2011F 可以指定为 \x{2011F} ,而不是代理对 \uD840 \uDD1F 的两个连续 Unicode 转义序列。

Unicode 字符名称由命名字符构造 \N{ ...} 支持,例如, \N{WHITE SMILING FACE} 指定字符 \u263A 。此类支持的字符名称是 Character.codePointOf(name) 匹配的有效 Unicode 字符名称。

Unicode 扩展字素簇 由字素簇匹配器 \X 和相应的边界匹配器 \b{g} 支持。

Unicode 脚本、块、类别和二进制属性是用 \p\P 结构编写的,就像在 Perl 中一样。 \p{支柱} 如果输入具有属性则匹配支柱\P{支柱如果输入具有该属性,则 } 不匹配。

脚本、块、类别和二进制属性可以在字符类的内部和外部使用。

脚本 使用前缀 Is 指定,如 IsHiragana ,或使用 script 关键字(或其缩写形式 sc )如 script=Hiraganasc=Hiragana

Pattern 支持的脚本名称是 UnicodeScript.forName 接受和定义的有效脚本名称。

积木 使用前缀 In 指定,如 InMongolian ,或使用关键字 block (或其缩写形式 blk )如 block=Mongolianblk=Mongolian

Pattern 支持的块名称是 UnicodeBlock.forName 接受和定义的有效块名称。

类别 可以使用可选前缀 Is 指定:\p{L}\p{IsL} 均表示 Unicode 字母的类别。与脚本和块一样,类别也可以通过使用关键字 general_category (或其缩写形式 gc )来指定,如 general_category=Lugc=Lu

支持的类别是 Character 类指定版本中的 Unicode标准 类别。类别名称是标准中定义的名称,既是规范性的又是信息性的。

二元属性 以前缀 Is 指定,如 IsAlphabeticPattern 支持的二进制属性是

  • Alphabetic
  • 表意文字
  • Letter
  • Lowercase
  • 大写
  • Titlecase
  • 标点
  • Control
  • 空白
  • 数字
  • Hex_Digit
  • Join_Control
  • 非字符代码点
  • Assigned

下列预定义字符类POSIX 字符类符合的建议附件 C:兼容性属性Unicode 技术标准 #18:Unicode 正则表达式 的,当指定 UNICODE_CHARACTER_CLASS 标志时。

Unicode 模式下的预定义和 posix 字符类
火柴
\p{Lower} 一个小写字符:\p{IsLowercase}
\p{Upper} 一个大写字符:\p{IsUppercase}
\p{ASCII} 所有 ASCII:[\x00-\x7F]
\p{Alpha} 字母字符:\p{IsAlphabetic}
\p{Digit} 十进制数字字符:\p{IsDigit}
\p{Alnum} 字母数字字符:[\p{IsAlphabetic}\p{IsDigit}]
\p{Punct} 一个标点符号:\p{IsPunctuation}
\p{Graph} 可见字符:[^\p{IsWhite_Space}\p{gc=Cc}\p{gc=Cs}\p{gc=Cn}]
\p{Print} 可打印字符:[\p{Graph}\p{Blank}&&[^\p{Cntrl}]]
\p{Blank} 空格或制表符:[\p{IsWhite_Space}&&[^\p{gc=Zl}\p{gc=Zp}\x0a\x0b\x0c\x0d\x85]]
\p{Cntrl} 控制字符:\p{gc=Cc}
\p{XDigit} 十六进制数字:[\p{gc=Nd}\p{IsHex_Digit}]
\p{Space} 空白字符:\p{IsWhite_Space}
\d 一个数字:\p{IsDigit}
\D 非数字:[^\d]
\s 空白字符:\p{IsWhite_Space}
\S 非空白字符:[^\s]
\w A字字符:[\p{Alpha}\p{gc=Mn}\p{gc=Me}\p{gc=Mc}\p{Digit}\p{gc=Pc}\p{IsJoin_Control}]
\W 非单词字符:[^\w]

Categories that behave like the java.lang.Character boolean ismethodname methods (except for the deprecated ones) are available through the same \p{ 支柱} syntax where the specified property has the name javamethodname .

与 Perl 5 的比较

Pattern 引擎执行传统的基于 NFA 的匹配以及 Perl 5 中出现的有序交替。

此类不支持的 Perl 结构:

  • 反向引用构造,\g{n}n捕获组\g{name}命名捕获组

  • 条件结构 (?(状况) X)(?(状况) X| Y) ,

  • 嵌入式代码构造(?{code})(??{code}) ,

  • 嵌入式注释语法 (?#comment)

  • 预处理操作 \l \u\L\U

此类支持但 Perl 不支持的构造:

  • 多于 中描述的字符类并集和交集。

与 Perl 的显着区别:

  • 在 Perl 中,\1\9 总是被解释为反向引用;如果至少存在那么多子表达式,则大于 9 的反斜杠转义数字将被视为反向引用,否则,如果可能,它被解释为八进制转义。在此类中,八进制转义符必须始终以零开头。在此类中,\1\9 始终被解释为反向引用,如果正则表达式中至少存在那么多子表达式,则更大的数字被接受为反向引用,否则解析器将丢弃数字直到数字更小或等于现有组数或为一位数。

  • Perl 使用g 标志来请求从上次匹配停止的地方继续的匹配。此功能由 Matcher 类隐式提供:重复调用 find 方法将从上次匹配停止的地方恢复,除非匹配器被重置。

  • 在 Perl 中,表达式顶层的嵌入标志会影响整个表达式。在这个类中,嵌入的标志总是在它们出现的地方生效,无论它们是在顶层还是在组内;在后一种情况下,标志在组的末尾恢复,就像在 Perl 中一样。

  • 自由间距模式在 Perl 中(称为评论模式在此类中)在正则表达式中由 (?x) 表示(或在编译表达式时由 COMMENTS 标志表示)将不会忽略字符类内的空格。在此类中,字符类中的空格必须被转义,以便在注释模式下被视为正则表达式的一部分。

有关正则表达式构造行为的更准确描述,请参阅 Mastering Regular Expressions, 3rd Edition, Jeffrey E. F. Friedl, O'Reilly and Associates, 2006.

自从:
1.4
参见:
  • 字段详细信息

    • UNIX_LINES

      public static final int UNIX_LINES
      启用 Unix 行模式。

      在此模式下,在 .^$ 的行为中仅识别 '\n' 行终止符。

      Unix 行模式也可以通过嵌入式标志表达式 (?d) 启用。

      参见:
    • CASE_INSENSITIVE

      public static final int CASE_INSENSITIVE
      启用不区分大小写的匹配。

      默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。可以通过指定 UNICODE_CASE 标志和此标志来启用识别 Unicode 的不区分大小写的匹配。

      也可以通过嵌入的标志表达式 (?i) 启用不区分大小写的匹配。

      指定此标志可能会带来轻微的性能损失。

      参见:
    • COMMENTS

      public static final int COMMENTS
      模式中允许空格和注解。

      在这种模式下,空格会被忽略,以 # 开头的嵌入注释会被忽略,直到一行结束。注释模式忽略模式字符串中包含的字符类中的空格。这样的空白必须被转义才能被认为是重要的。

      注释模式也可以通过嵌入的标志表达式 (?x) 启用。

      参见:
    • MULTILINE

      public static final int MULTILINE
      启用多行模式。

      在多行模式下,表达式 ^$ 分别匹配行终止符或输入序列的末尾之前或之前。默认情况下,这些表达式仅匹配整个输入序列的开头和结尾。

      也可以通过嵌入式标志表达式 (?m) 启用多行模式。

      参见:
    • LITERAL

      public static final int LITERAL
      启用模式的文字解析。

      当指定此标志时,指定模式的输入字符串将被视为文字字符序列。输入序列中的元字符或转义序列不会被赋予特殊含义。

      标志 CASE_INSENSITIVE 和 UNICODE_CASE 在与此标志结合使用时保留它们对匹配的影响。其他标志变得多余。

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

      自从:
      1.5
      参见:
    • DOTALL

      public static final int DOTALL
      启用 dotall 模式。

      在 dotall 模式下,表达式 . 匹配任何字符,包括行终止符。默认情况下,此表达式不匹配行终止符。

      Dotall 模式也可以通过嵌入的标志表达式 (?s) 启用。 (s 是“单行”模式的助记符,在 Perl 中就是这样称呼的。)

      参见:
    • UNICODE_CASE

      public static final int UNICODE_CASE
      启用 Unicode 感知大小写折叠。

      当指定此标志时,不区分大小写的匹配(如果由 CASE_INSENSITIVE 标志启用)将以与 Unicode 标准一致的方式完成。默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。

      还可以通过嵌入的标志表达式 (?u) 启用 Unicode 感知大小写折叠。

      指定此标志可能会造成性能损失。

      参见:
    • CANON_EQ

      public static final int CANON_EQ
      启用规范等价。

      当指定此标志时,当且仅当它们的完整规范分解匹配时,两个字符才会被视为匹配。例如,当指定此标志时,表达式 "a\u030A" 将匹配字符串 "\u00E5"。默认情况下,匹配不考虑规范等价。

      没有用于启用规范等效的嵌入标志字符。

      指定此标志可能会造成性能损失。

      参见:
    • UNICODE_CHARACTER_CLASS

      public static final int UNICODE_CHARACTER_CLASS
      启用 Unicode 版本预定义字符类POSIX 字符类.

      当指定此标志时(仅限 US-ASCII)预定义字符类POSIX 字符类符合Unicode 技术标准 #18:Unicode 正则表达式附件 C:兼容性属性.

      UNICODE_CHARACTER_CLASS 模式也可以通过嵌入的标志表达式 (?U) 启用。

      该标志暗示 UNICODE_CASE,也就是说,它启用 Unicode 感知大小写折叠。

      指定此标志可能会造成性能损失。

      自从:
      1.7
      参见:
  • 方法详情

    • compile

      public static Pattern  compile(String  regex)
      将给定的正则表达式编译成一个模式。
      参数:
      regex - 要编译的表达式
      返回:
      将给定的正则表达式编译成一个模式
      抛出:
      PatternSyntaxException - 如果表达式的语法无效
    • compile

      public static Pattern  compile(String  regex, int flags)
      将给定的正则表达式编译成具有给定标志的模式。
      参数:
      regex - 要编译的表达式
      flags - 匹配标志,一个位掩码,可能包括 CASE_INSENSITIVE MULTILINE DOTALL UNICODE_CASE CANON_EQ UNIX_LINES LITERAL UNICODE_CHARACTER_CLASS COMMENTS
      返回:
      将给定的正则表达式编译成具有给定标志的模式
      抛出:
      IllegalArgumentException - 如果在 flags 中设置的位值与定义的匹配标志对应的位值不同
      PatternSyntaxException - 如果表达式的语法无效
    • pattern

      public String  pattern()
      返回编译此模式的正则表达式。
      返回:
      这个图案的来源
    • toString

      public String  toString()

      返回此模式的字符串表示形式。这是编译此模式的正则表达式。

      重写:
      toString 在类 Object
      返回:
      此模式的字符串表示
      自从:
      1.5
    • matcher

      public Matcher  matcher(CharSequence  input)
      创建一个匹配器,将给定输入与此模式匹配。
      参数:
      input - 要匹配的字符序列
      返回:
      此模式的新匹配器
    • flags

      public int flags()
      返回此模式的匹配标志。
      返回:
      编译此模式时指定的匹配标志
    • matches

      public static boolean matches(String  regex, CharSequence  input)
      编译给定的正则表达式并尝试匹配给定的输入。

      调用此表单的便捷方法

       Pattern.matches(regex, input);
      行为方式与表达式完全相同
       Pattern.compile(regex).matcher(input).matches()

      如果一个模式要被多次使用,编译一次再使用会比每次都调用这个方法效率更高。

      参数:
      regex - 要编译的表达式
      input - 要匹配的字符序列
      返回:
      正则表达式是否匹配输入
      抛出:
      PatternSyntaxException - 如果表达式的语法无效
    • split

      public String [] split(CharSequence  input, int limit)
      围绕此模式的匹配项拆分给定的输入序列。

      此方法返回的数组包含输入序列的每个子字符串,这些子字符串由匹配此模式的另一个子序列终止或由输入序列的末尾终止。数组中的子字符串按照它们在输入中出现的顺序排列。如果此模式不匹配输入的任何子序列,则结果数组只有一个元素,即字符串形式的输入序列。

      当输入序列的开头存在正宽度匹配时,结果数组的开头将包含一个空的前导子字符串。然而,开头的零宽度匹配永远不会产生这样的空前导子字符串。

      limit 参数控制应用模式的次数,因此会影响结果数组的长度。

      • 如果limit为正则最多应用该模式limit- 1 次,数组的长度将不大于limit, 并且数组的最后一个条目将包含最后一个匹配的定界符之外的所有输入。

      • 如果limit为零则模式将被应用尽可能多的次数,数组可以有任何长度,尾随的空字符串将被丢弃。

      • 如果limit为负则模式将被应用尽可能多的次数并且数组可以有任何长度。

      例如,输入 "boo:and:foo" 使用这些参数产生以下结果:

      显示正则表达式、限制和结果的拆分示例
      Regex 限制 Result
      : 2 { "boo", "and:foo" }
      5 { "boo", "and", "foo" }
      -2 { "boo", "and", "foo" }
      o 5 { "b", "", ":and:f", "", "" }
      -2 { "b", "", ":and:f", "", "" }
      0 { "b", "", ":and:f" }
      参数:
      input - 要拆分的字符序列
      limit - 结果阈值,如上所述
      返回:
      通过围绕此模式的匹配项拆分输入计算的字符串数组
    • split

      public String [] split(CharSequence  input)
      围绕此模式的匹配项拆分给定的输入序列。

      此方法的工作方式就好像通过使用给定的输入序列和零限制参数调用双参数 split 方法一样。因此,结果数组中不包含尾随的空字符串。

      例如,输入 "boo:and:foo" 使用这些表达式产生以下结果:

      显示正则表达式和结果的拆分示例
      Regex Result
      : { "boo", "and", "foo" }
      o { "b", "", ":and:f" }
      参数:
      input - 要拆分的字符序列
      返回:
      通过围绕此模式的匹配项拆分输入计算的字符串数组
    • quote

      public static String  quote(String  s)
      返回指定 String 的文字模式 String

      此方法生成一个 String,可用于创建一个 Pattern,该 Pattern 将匹配字符串 s,就好像它是文字模式一样。

      输入序列中的元字符或转义序列不会被赋予特殊含义。
      参数:
      s - 要文字化的字符串
      返回:
      文字字符串替换
      自从:
      1.5
    • namedGroups

      public Map <String ,Integer > namedGroups()
      返回一个不可修改的映射,从捕获组名到组号。如果没有命名组,则返回一个空映射。
      返回:
      从捕获组名到组号的不可修改的映射
      自从:
      20
    • asPredicate

      public Predicate <String > asPredicate()
      创建一个谓词来测试是否在给定的输入字符串中找到此模式。
      API 注意:
      此方法创建一个谓词,其行为就好像它从输入序列创建一个匹配器,然后调用 find ,例如以下形式的谓词:
      
        s -> matcher(s).find();
        
      返回:
      可用于在字符串的子序列上查找匹配项的谓词
      自从:
      1.8
      参见:
    • asMatchPredicate

      public Predicate <String > asMatchPredicate()
      创建一个谓词来测试此模式是否与给定的输入字符串匹配。
      API 注意:
      此方法创建一个谓词,其行为就好像它从输入序列创建一个匹配器,然后调用 matches ,例如以下形式的谓词:
      
        s -> matcher(s).matches();
        
      返回:
      可用于根据此模式匹配输入字符串的谓词。
      自从:
      11
      参见:
    • splitAsStream

      public Stream <String > splitAsStream(CharSequence  input)
      围绕此模式的匹配项从给定的输入序列创建一个流。

      此方法返回的流包含输入序列的每个子字符串,这些子字符串由匹配此模式的另一个子序列终止或由输入序列的末尾终止。流中的子字符串按照它们在输入中出现的顺序排列。尾随的空字符串将被丢弃并且不会在流中遇到。

      如果此模式不匹配输入的任何子序列,则结果流只有一个元素,即字符串形式的输入序列。

      当输入序列的开头存在正宽度匹配时,流的开头将包含一个空的前导子字符串。然而,开头的零宽度匹配永远不会产生这样的空前导子字符串。

      如果输入序列是可变的,它必须在执行终端流操作期间保持不变。否则,终端流操作的结果是未定义的。

      参数:
      input - 要拆分的字符序列
      返回:
      通过围绕此模式的匹配项拆分输入计算的字符串流
      自从:
      1.8
      参见: