一、使用方法
使用方法有两种:
第一种:
Pattern p = Pattern.compile("[abc]");
Matcher matcher = p.matcher("b");
Boolean b = matcher.matches();
第二种:
Boolean c = Pattern.matches("[abc]", "a");
注意,前面才是表达式,后面是被匹配的东西~
二、基础说明
字母的大小写问题
正则表达式里是区分大小写的,apple跟Apple匹配的结果是不一样的。匹配任意字符
.字符(英文句号)可以匹配任何一个单个的字符、字母、数字甚至是.字符本身,相当于DOS文件搜索功能里的?,SQL中的_(下划线)字符。举个栗子:
(1)文本:
sales.xls
sales1.xls
orders3.xls
na1.xls
sa1.xls
(2)正则表达式:
sales.
(3)匹配结果:
sales.xls
sales1.xls备注:. 字符可以使用多个的,如果只匹配. 字符本身,就用\ 字符,用 \ .表示。
匹配某个字符
表达式[ns]表示匹配n或者s单个字符。字符区间
表达式[0-9]表示匹配0-9之间的一位数字,等价于[0123456789]。同理,A-Z表示A到Z所有大写字母;
a-z表示a-z所有小写字母表达式[A-Za-z0-9]表示任何一个字母(无论大小写)或者数字。
举个栗子
(1)文本:
sales.xls
sales1.xls
orders3.xls
na1.xls
sa1.xls
(2)正则表达式:
[ns]a[0-9].xls
(3)匹配结果:
na1.xls
sa1.xls取非匹配
表达式[^0-9]表示不是数字的字符。
三、使用元字符
特殊字符转义
除了上述的.字符,再比如[ 这个元字符,在正则中用来表示一个区间,如果要匹配本身就用[;
如果要匹配\这个字符,就用\来匹配。注意:\这个字符是不可以单独出现在正则表达式中的,其后必跟着另一个字符。
匹配数字与非数字
\d 表示任何一个数字,等价于[0-9];
\D 表示任何一个非数字,等价于[^0-9].匹配字母和数字,以及非字母和数字
\w 表示任何一个字母数字字符(包括大小写)或下划线,等价于[a-zA-Z0-9_];
\W 表示任何一个非字母数字或非下划线字符,等价于[^a-zA-Z0-9_]匹配空白字符,以及非空白字符
\s 表示任何一个空白字符,等价于[\f\n\r\t\v]
\S 表示任何一个非空白字符,等价于[^\f\n\r\t\v]
四、重复匹配
匹配一个或多个字符
+表示匹配一个或多个这样的字符,举个栗子
[0-9]匹配单个数字,[0-9]+匹配一个或多个连续出现的数字。匹配零个或多个字符
+至少要匹配一个字符,而*可以匹配一个字符出现零次或者多次。
匹配零个或一个字符
?匹配一个字符出现零次或者一次,最多不超过一次。
匹配指定重复次数
{}匹配一个字符出现特定次数,举个栗子
a{3}匹配aaa。重复次数是一个区间
a{2,6}表示a出现2到6次。
至少重复多少次
a{2, }表示a至少出现2次。
五、位置匹配
边界限定符的概念
举个栗子
The cat scattered his food all over the room.
如果正则表达式是cat的话,会匹配出两个单词cat 和 scatter,如果只想匹配出cat呢?
这就引发了我们的深思,于是就有了边界限定符的概念。
单词边界
第一种边界也就是最常用的—单词边界,用限定符\b来指定,用来匹配一个单词的开始或结尾。
来看下面这个栗子
The captain wore his cap and cape proudly as he sat listening to the recap of how his crew saved the men from a capsized vessel.正则表达式如果是
cap\b
就会匹配到cap跟recap正则表达式如果是
\bcap
就会匹配到cap、cape以及capsized正则表达式如果是
\bcap\b
就会匹配到cap这里还有一种情况,举个栗子
文本:
Please enter the nine-digit id as it appears on your color - coded pass-key.在这个文本里,color - coded左右都有一个空格,而nine-digit和pass-key都没有,那么如何来匹配这种“空格字符空格”这样的连字符呢?这里就用\B字符。
正则表达式如果是
\B-\B就可以匹配到前后都有多余空格的连字符。
以上就是边界匹配。
字符串匹配
^匹配一个字符串的开头,$匹配一个字符串的结尾
有这样一种情况:
合法的XML文件文档必须以 < ?xml>标签开头并带有一些其他的属性。
文本:
This is wrong.
< ?xml version="1.0" encoding="ISO-8859-1"?>
< web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
正则表达式:
< \?xml.*\?>
结果就会匹配到第二行,但是这个文件却不是一个合法的XML文件,这里需要被匹配到的< ?xml>标签在字符串的最开始处,就需要用到元字符^。
元字符^有多种用途,在前面提到,当^在方括号[和]之间并紧跟在左方括号[后面的时候,like this,[^0-9],这样的格式可以用作求非;
元字符^还可以用来匹配一个字符串的开头位置。
正则表达式如果是
^\s*< \?xml.*\?>
就可以用来判断< ?xml>标签是否在字符串的最开始,这里的\s*是为了解决< ?xml>标签前允许有空格,制表符,换行符等空白字符的问题。
那么还有一种情况,在一个web页面里,< /html>标签后面不应该再有任何实际内容,那就可以用正则表达式
< /[Hh][Tt][Mm][Ll]>\s*
来匹配。
匹配了一个字符串的结尾,\s*表示了零个或多个空白字符。
六、使用子表达式
子表达式
HTML中常会用非换行型  ;,一用就用好几个,那怎样匹配多个  ;呢?
前面说到花括号{}可以用来表示字符重复的次数,但是正则表达式为
  ;{2, }
并不能匹配到  ;  ; ,只能匹配到  ;;;;;这样的字符串,因为{2, }只能作用于紧挨着它的前一个字符,所以该正则表达式就应该改成
(  ;){2, }
就可以达到预期的效果。这里就用元字符(和)将子表达式括起来了。重复的子表达式
这是什么意思呢?举个栗子,假如现在要匹配一个IP地址,IP地址的格式是用英文句号.分隔的四组数字,如12.150.46.200,正则表达式如果是
\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
是可以匹配到IP地址的,但是我们注意到,这里\d{1,3}.这个表达式重复了三次,所以可以写为
(\d{1,3}.){3}\d{1,3}