一、元字符
-
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,
n
匹配字符n
。\n
匹配一个换行符。序列\\
匹配\
而\(
则匹配(
。 -
^
匹配输入字符串的开始位置。如果设置了
RegExp
对象的Multiline
属性,^
也匹配\n
或\r
之后的位置。 -
$
匹配输入字符串的结束位置。如果设置了
RegExp
对象的Multiline
属性,$
也匹配\n
或\r
之前的位置。 -
*
匹配前面的子表达式零次或多次。例如,
zo*
能匹配z
以及zoo
。*
等价于{0,}
。 -
+
匹配前面的子表达式一次或多次。例如,
zo+
能匹配zo
以及zoo
,但不能匹配z
。+
等价于{1,}
。 -
?
匹配前面的子表达式零次或一次。例如,
do(es)?
可以匹配do
或does
。?
等价于{0,1}
。 -
{n}
n
是一个非负整数。匹配确定的n
次。例如,o{2}
不能匹配Bob
中的o
,但是能匹配food
中的两个o
。 -
{n,}
n
是一个非负整数。至少匹配n
次。例如,o{2,}
不能匹配Bob
中的o
,但能匹配foooood
中的所有o
。o{1,}
等价于o+
。o{0,}
则等价于o*
。 -
{n,m}
n
和m
均为非负整数,其中n <= m
。最少匹配n
次且最多匹配m
次。例如,"o{1,3}"
将匹配"fooooood"
中的前三个o
。'o{0,1}'
等价于'o?'
。请注意在逗号和两个数之间不能有空格。 -
?
当该字符紧跟在任何一个其他限制符
(*, +, ?, {n}, {n,}, {n,m})
后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串oooo
,o+?
将匹配单个o
,而o+
将匹配所有o
。 -
.
匹配除换行符
(\n、\r)
之外的任何单个字符。要匹配包括\n
在内的任何字符,请使用像**(.|\n)**
的模式。 -
(pattern)
匹配
pattern
并获取这一匹配。所获取的匹配可以从产生的Matches
集合得到,要匹配圆括号字符,请使用\(
或\)
。 -
(?:patern)
匹配
pattern
但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符(|)
来组合一个模式的各个部分是很有用。例如,industr(?:y|ies)
就是一个比industry|industries
更简略的表达式。 -
(?=pattern)
正向肯定预查
(look ahead positive assert)
,在任何匹配pattern
的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,Windows(?=95|98|NT|2000)
能匹配Windows2000
中的Windows
,但不能匹配Windows3.1
中的Windows
。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 -
(?!pattern)
正向否定预查
(negative assert)
,在任何不匹配pattern
的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如Windows(?!95|98|NT|2000)
能匹配Windows3.1
中的Windows
,但不能匹配Windows2000
中的Windows
。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 -
(?<=pattern)
反向
(look behind)
肯定预查,与正向肯定预查类似,只是方向相反。例如,(?<=95|98|NT|2000)Windows
能匹配2000Windows
中的Windows
,但不能匹配3.1Windows
中的Windows
。 -
(?<!pattern)
反向否定预查,与正向否定预查类似,只是方向相反。例如
(?<!95|98|NT|2000)Windows
能匹"3.1Windows
中Windows
,但不能匹配2000Windows
中的Windows
。 -
x|y
匹配
x
或y
。例如,z|food
能匹配z
或food
。(z|f)ood
则匹配zood
或zood
。 -
[xyz]
字符集合。匹配所包含的任意一个字符。例如,
[abc]
可以匹配plain
中的a
。 -
[^xyz]
负值字符集合。匹配未包含的任意字符。例如,
[^abc]
可以匹配plain
中的p
、l
、i
、n
。 -
[a-z]
字符范围。匹配指定范围内的任意字符。例如,
[a-z]
可以匹配a
到z
范围内的任意小写字母字符。 -
[^a-z]
负值字符范围。匹配任何不在指定范围内的任意字符。例如,
[^a-z]
可以匹配任何不在a
到z
范围内的任意字符。 -
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如,
er\b
可以匹配never
中的er
,但不能匹配verb
中的er
。 -
\B
匹配非单词边界。
er\B
能匹配verb
中的er
,但不能匹配never
中的er
。 -
\cx
匹配由
x
指明的控制字符。例如,\cM
匹配一个Control-M
或回车符。x
的值必须为A-Z
或a-z
之一。否则,将c
视为一个原义的c
字符。 -
\d
匹配一个数字字符。等价于
[0-9]
。 -
\D
匹配一个非数字字符。等价于
[^0-9]
。 -
\f
匹配一个换页符。等价于
\x0c
和\cL
。 -
\n
匹配一个换行符。等价于
\x0a
和\cJ
。 -
\r
匹配一个回车符。等价于
\x0d
和\cM
。 -
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于
[ \f\n\r\t\v]
。 -
\S
匹配任何非空白字符。等价于
[^ \f\n\r\t\v]
。 -
\t
匹配一个制表符。等价于
\x09
和\cI
。 -
\v
匹配一个垂直制表符。等价于
\x0b
和\cK
。 -
\w
匹配字母、数字、下划线。等价于
[A-Za-z0-9_]
。 -
\W
匹配非字母、数字、下划线。等价于
[^A-Za-z0-9_]
。 -
\xn
匹配
n
,其中n
为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,\x41
匹配A
。\x041
则等价于\x04 & 1
。正则表达式中可以使用ASCII
编码。 -
\num
匹配
num
,其中num
是一个正整数。对所获取的匹配的引用。例如,(.)\1
匹配两个连续的相同字符。 -
\n
标识一个八进制转义值或一个向后引用。如果
\n
之前至少n
个获取的子表达式,则n
为向后引用。否则,如果n
为八进制数字(0-7)
,则n
为一个八进制转义值。 -
\nm
标识一个八进制转义值或一个向后引用。如果
\nm
之前至少有nm
个获得子表达式,则nm
为向后引用。如果\nm
之前至少有n
个获取,则n
为一个后跟文字m
的向后引用。如果前面的条件都不满足,若n
和m
均为八进制数字(0-7)
,则\nm
将匹配八进制转义值nm
。 -
\nml
如果
n
为八进制数字(0-3)
,且m
和l
均为八进制数字(0-7)
,则匹配八进制转义值nml
。 -
\un
匹配
n
,其中n
是一个用四个十六进制数字表示的Unicode
字符。例如,\u00A9
匹配版权符号(?)
。
二、修饰符
-
i
ignore
- 不区分大小写将匹配设置为不区分大小写,搜索时不区分大小写:
A
和a
没有区别。 -
g
global
- 全局匹配查找所有的匹配项。
-
m
multi line
- 多行匹配使边界字符
^
和$
匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。 -
s
特殊字符圆点 . 中包含换行符
\n
默认情况下的圆点 . 是 匹配除换行符
\n
之外的任何字符,加上s
修饰符之后,.
中包含换行符\n
。
三、运算符优先级
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。
-
\
转义符
-
(), (?:), (?=), []
圆括号和方括号
-
*, +, ?, {n}, {n,}, {n,m}
限定符
-
^, $, \任何元字符、任何字符
定位点和序列(即:位置和顺序)
-
|
替换,"或"操作。字符具有高于替换运算符的优先级,使得
m|food
匹配m
或food
。若要匹配mood
或food
,请使用括号创建子表达式,从而产生(m|f)ood
。
四、匹配规则
-
once
,匹配所有包含once
的字符串@Test public void test01() { String regex = "time"; String originalString = "once upon a time, once upon a time"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(originalString); originalString = matcher.replaceAll("hello "); System.out.println("originalString = " + originalString); }
-
^once
,匹配以once
开头的字符串@Test public void test01() { String regex = "^once"; String originalString = "once upon a time"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(originalString); boolean b = matcher.find(); System.out.println(b); }
^\t
: 表示以制表符开头^\n
: 表示以换行符开头 -
time$
,匹配以time
结尾的字符串@Test public void test01() { String regex = "time$"; String originalString = "once upon a time"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(originalString); boolean b = matcher.find(); System.out.println(b); }
-
组合匹配
-
[a-z]
: 匹配所有的小写字母 -
[A-Z]
: 匹配所有的大写字母 -
[a-zA-Z]
: 匹配所有字母 -
[0-9]
: 匹配所有的数字 -
[0-9\.\-]
: 匹配所有的数字,句号和减号 -
[\f\r\t\n]
: 匹配所有的空白符
匹配以数字开头的字符串:
^[0-9]
,例如:12
,34
匹配第一位不是数字的字符串:
^[^0-9][0-9]
,第一个^
表示开头,第二个^
表示取反。例如:a1
,b2
^[a-zA-Z_]{1,}$
: 所有的字母和下划线^a{1,4}$
:匹配a
,aa
,aaa
,aaaa
^a{2,}
: 匹配aa
,aaa
,aab
.{2}
: 所有的两个字符
{x,y}
: 表示前面的字符至少出现x
此,但不超过y
次^[1-9][0-9]{0,}$
:所有的正整数^\-{0,1}[0-9]{1,}$
:所有的整数^[-]?[0-9]+\.?[0-9]+$
: 所有的浮点数
*
与{0,}
表达效果相等,+
与{1,}
表达效果相等^[a-zA-Z_]+$
: 所有的字母和下划线^[1-9][0-9]*$
:所有的正整数^\-{0,1}[0-9]+$
:所有的整数^[-]?[0-9]+(\.[0-9])?$
: 所有的浮点数
-