Java与正则表达式

Author Avatar
罗炜光 5月 04, 2016
  • 在其它设备中阅读本文章

Pattern类

返回类型 方法名 解释
static Pattern compile(String regex) 将给定的正则表达式编译到模式中。
static Pattern compile(String regex, int flags) 将给定的正则表达式编译到具有给定标志的模式中。
int flags() 返回此模式的匹配标志。
Matcher matcher(CharSequence input) 创建匹配给定输入与此模式的匹配器。
static boolean matches(String regex, CharSequence input) 编译给定正则表达式并尝试将给定输入与其匹配。
String pattern() 返回在其中编译过此模式的正则表达式。
static String quote(String s) 返回指定 String 的字面值模式 String。
String[] split(CharSequence input) 围绕此模式的匹配拆分给定输入序列。
String[] split(CharSequence input, int limit) 围绕此模式的匹配拆分给定输入序列。
String toString() 返回此模式的字符串表示形式。

flag的取值范围如下:

编译标志 效果
Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹配,只要将UNICODE_CASE与这个标志合起来就行了。
Pattern.COMMENTS(?x) 在这种模式下,匹配时会忽略(正则表达式里的)空格字符(注:不是指表达式里的”//s”,而是指表达式里的空格,tab,回车之类)。注释从#开始,一直到这行结束。可以通过嵌入式的标志来启用Unix行模式。
Pattern.MULTILINE(?m) 在这种模式下,’^’和’\$’分别匹配一行的开始和结束。此外,’^’仍然匹配字符串的开始,’\$’也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。
Pattern.LITERAL 指定此标志后,指定模式的输入字符串就会作为字面值字符序列来对待。输入序列中的元字符或转义序列不具有任何特殊意义。标志 CASE_INSENSITIVE 和 UNICODE_CASE在与此标志一起使用时将对匹配产生影响。其他标志都变得多余了。
Pattern.DOTALL(?s) 在这种模式下,表达式’.’可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式’.’不匹配行的结束符。
Pattern.UNIX_LINES(?d) 在这个模式下,只有’/n’才被认作一行的中止,并且与’.’,’^’,以及’$’进行匹配。
Pattern.UNICODE_CASE(?u) 在这个模式下,如果你还启用了CASE_INSENSITIVE标志,不区分大小写的匹配将以符合 Unicode Standard 的方式完成。默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。
Pattern.CANON_EQ 启用规范等价。指定此标志后,当且仅当其完整规范分解匹配时,两个字符才可视为匹配。例如,当指定此标志时,表达式 “a\u030A” 将与字符串 “\u00E5” 匹配。默认情况下,匹配不考虑采用规范等价。

正则表达式的构造

构造 匹配
字符
x 字符x
\^ ^
\\ 反斜线字符
\0n 带有八进制值 0 的字符 n (0 <= n <= 7)
\0nn 带有八进制值 0 的字符 nn (0 <= n <= 7)
\0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 带有十六进制值 0x 的字符 hh
\uhhhh 带有十六进制值 0x 的字符 hhhh
\t 制表符 (‘\u0009’)
\n 新行(换行)符 (‘\u000A’)
\r 回车符 (‘\u000D’)
\f 换页符 (‘\u000C’)
\a 报警 (bell) 符 (‘\u0007’)
\e 转义符 (‘\u001B’)
\cx 对应于 x 的控制符
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\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{Lu} 大写字母
\p{Ll} 小写字母
\p{Sc} 货币符号
边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
匹配优先量词
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个捕获组
环视
(?<=Expression) 逆序肯定环视,表示所在位置左侧能够匹配Expression
(?<!Expression) 逆序否定环视,表示所在位置左侧不能匹配Expression
(?=Expression) 顺序肯定环视,表示所在位置右侧能够匹配Expression
(?!Expression) 顺序否定环视,表示所在位置右侧不能匹配Expression

Java的逆序环视中不支持不定长度的量词如 * + {m,n}

模式修饰符:(?modifier)
(?i)...(?-i)    不区分大小写
(?x)...(?-x)    宽松排列和注释模式
(?s)...(?-s)    点号通配模式
(?m)...(?-m)    增强的行锚点模式

宽松排列和注释模式:
在此模式下会忽略字符组外部的所有空白字符。
#符号和换行符之间的内容视为注释

点号通配模式:
在此模式下。号匹配换行符

增强的行锚点模式:
在此模式下^ $能够匹配字符串

文字文本模式:
\Q…\E

模式作用范围(?modifier:…)

(?< name >X) 捕获组名(API1.7)

捕获型括号:(…) \1 \2

仅分组的括号:(?:…)

固化分组:(?>…)

Matcher

返回类型 方法名 解释
Matcher appendReplacement(StringBuffer sb, String replacement) 将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里
StringBuffer appendTail(StringBuffer sb) 将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里
int end() 返回当前匹配的子串的最后一个字符在原目标字符串中的索引位置
int end(int group) 返回与匹配模式里指定的组相匹配的子串最后一个字符的位置
int end(String name) 返回与匹配模式里指定的组相匹配的子串最后一个字符的位置(API1.8)
boolean find() 尝试在目标字符串里查找下一个匹配子串
boolean find(int start) 重设 Matcher 对象,并且尝试在目标字符串里从指定的位置开始查找下一个匹配的子串
String group() 返回当前查找而获得的与组匹配的所有子串内容
String group(int group) 返回当前查找而获得的与指定的组匹配的子串内容
String group(String name) 返回当前查找而获得的与指定的组匹配的子串内容(API1.7)
int groupCount() 返回当前查找所获得的匹配组的数量
boolean hasAnchoringBounds() 查询此匹配器区域界限的定位。
boolean hasTransparentBounds() 查询此匹配器区域边界的透明度。
boolean hitEnd() 如果匹配器执行的最后匹配操作中搜索引擎遇到输入结尾,则返回 true。
boolean lookingAt() 检测目标字符串是否以匹配的子串起始
boolean matches() 尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值
Pattern pattern() 返回该 Matcher 对象的现有匹配模式,也就是对应的 Pattern 对象
static String quoteReplacement(String s) 返回指定 String 的字面值替换 String
Matcher region(int start, int end) 设置此匹配器的区域限制
int regionEnd() 报告此匹配器区域的结束索引(不包括)
int regionStart() 报告此匹配器区域的开始索引(包括)
String replaceAll(String replacement) 将目标字符串里与既有模式相匹配的子串全部替换为指定的字符串
String replaceFirst(String replacement) 将目标字符串里第一个与既有模式相匹配的子串替换为指定的字符串
int requireEnd() 如果很多输入都可以将正匹配更改为负匹配,则返回true
Matcher reset() 重设该 Matcher 对象
Matcher reset(CharSequence input) 重设该 Matcher 对象并且指定一个新的目标字符串
int start() 返回当前查找所获子串的开始字符在原目标字符串中的位置
int start(int group) 返回当前查找所获得的和指定组匹配的子串的第一个字符在原目标字符串中的位置
int start(String name) 返回当前查找所获得的和指定组匹配的子串的第一个字符在原目标字符串中的位置(API1.8)
MatchResult toMatchResult() 作为 MatchResult 返回此匹配器的匹配状态
String toString() 返回匹配器的字符串表示形式
Matcher useAnchoringBounds(boolean b) 设置匹配器区域界限的定位。
Matcher usePattern(Pattern newPattern) 更改此 Matcher 用于查找匹配项的 Pattern。
Matcher useTransparentBounds(boolean b) 设置此匹配器区域边界的透明度。

Matcher方法详解

matches() | lookingAt() | find()

  • matches() 尝试将整个区域与模式匹配。
  • lookingAt() 尝试将从区域开头开始的输入序列与该模式匹配与 matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。
  • find() 此方法从匹配器区域的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始。

※当上述其中一种方法调用后,才可以调用start、end 和 group 方法

replaceAll(String replacement) | replaceFirst(String replacementString replacement) | appendReplacement(StringBuffer sb, String replacement) | appendTail(StringBuffer sb)

  • replaceAll(String replacement) 使用replacement替代所有匹配的字符串
  • replaceFirst(String replacement) 使用replacement替代第一个匹配的字符串
  • appendReplacement(StringBuffer sb, String replacement) 读取开始匹配位置至匹配结束位置的字符串,使用replacement替代匹配的位置,将替换好的字符串添加到sb中
  • appendTail(StringBuffer sb) 将开始位置至匹配结束位置的字符串添加到sb中

※使用appendReplacement(StringBuffer sb, String replacement)方法前需使用matches(),lookingAt()或find()

useTransparentBounds(boolean b)

TransparentBounds属性默认为false,使用region(int start, int end)能够限定匹配的范围,当我们将TransparentBounds设置为ture时,匹配的限定范围将不只于所限定的范围

useAnchoringBounds(boolean b)

AnchoringBounds属性默认为ture,在此情况^表示开始\$表示结束,当设置为false时,^$将不在表示此意思

参考资料

精通正则表达式
Java学习札记19:详解Java中的Pattern和Matcher