正则表达式的基本用途即:搜索与替换。给定一个正则表达式,他要么匹配一些文本(进行一次搜索),要么匹配并替换一些文本(进行一次替换)。
匹配单个字符
匹配纯文本
eg:reg="string";
其中string即为需匹配的字符。需要注意:正则表达式是区分大小写的,即String不匹配string匹配任意字符
eg:reg=".";
其中.(英文句号)用于匹配任何一个单个的字符、字母、数字甚至是.字符本身匹配特殊字符
eg:reg="\.";
其中\(反斜杠)是一个元字符,用来对其后的符号进行转义。由于.字符在正则表达式中有特殊含义,所以需要用\来对其进行转义,.即匹配.字符本身
注意:如果需要搜索\本身,则需要对\进行转义,即reg="\\";
匹配一组字符
匹配多个字符中的某一个
eg:reg="[ns]";
[和]不匹配任何字符,它们只负责定义一个字符集和,这个集合将匹配字符n或s
eg:reg="[NnSs]";
这个集合将匹配字符N、n、S、s匹配字符集和区间
eg:reg="[0123456789]";
或reg="[0-9]";
这个集合将匹配任何一个数字
eg:reg="[A-Za-z]";
这个集合将匹配任何一个大小写字母取非匹配
eg:reg="[^0-9]";
其中元字符^表示对这个字符集合进行取非匹配,这个集合将匹配除了数字以外的任何字符
使用元字符
对特殊字符进行转义
eg:reg="\[\]";
这个集合将匹配[],任何一个元字符都可以通过给他加上一个反斜杠字符(\)作为前缀的办法来转义匹配空白字符
元字符 说明 [\b] 回退(并删除)一个字符(Backspace键) \f 换页符 \n 换行符 \r 回车符 \t 制表符(Tab键) \v 垂直制表符 eg:
reg="\r\n\r\n";
匹配windows系统中2条记录之间的一个空白行
eg:reg="\n\n";
匹配linux系统中2条记录之间的一个空白行匹配特定的字符类别
元字符 说明 \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]) eg:
reg="\d";
匹配任意一个数字字符
eg:reg="\w+[\w\.]*@[\w\.]+\.\w+";
匹配合法的电子邮件使用16进制与8进制
eg:reg="\x0A";
\x0A对应于ASCII字符10(换行符),其效果等价于\n
eg:reg="\011";
\011对应于ASCII字符9(制表符),其效果等价于\t使用POSIX字符类
字符集 说明 [:alnum:] 任何一个字母或数字(等价于[a-zA-Z0-9]) [:alpha:] 任何一个字母(等价于[a-zA-Z]) [:blank:] 空格或制表符(等价于[\t]) [:cntrl:] ASCII控制字符(ASCII 0-31,再加上ASCII 127) [:digit:] 任何一个数字(等价于[0-9]) [:graph:] 和[:print:]一样,但不包括空格 [:lower:] 任何一个小写字母(等价于[a-z]) [:print:] 任何一个可打印字符 [:punct:] 既不属于[:alnum:],也不属于[:cntrl:]的任何一个字符 [:space:] 任何一个空白字符,包括空格(等价于[^\f\n\r\t\v]) [:upper:] 任何一个大写字母(等价于[A-Z]) [:xdigit:] 任何一个十六进制数字(等价于[a-fA-F0-9]) eg:
reg="[[:xdigit:]]";
,等价于字符集和[a-fA-F0-9]
重复匹配
匹配一个或多个字符
eg:reg="\w+";
,其中+是一个元字符,可以用来匹配一个或多个字符,该集合匹配一个或多个字母数字或_字符
eg:reg="[0-9]+";
,该集合匹配一个或多个数字匹配零个或多个字符
eg:reg="\w*";
,*的用法与+完全一样,只要把它放在一个字符(或一个字符集合)的后面,就可以匹配该字符(或字符集合)连续出现零次或多次的情况匹配零个或一个字符
eg:reg="https?";
,?只能匹配一个字符(或字符集合)的零次或一次出现,最多不超过一次。若该字符可能出现,也可能不出现,则?无疑是最佳的选择。该集合指字符?前面的字符s要么不出现,要么最多出现一次匹配的重复次数
eg:reg="\d{6}";
,指匹配6个数字字符。{和}是元字符
eg:reg="\d{2,4}";
,指最少重复2次,最多重复4次
eg:reg="\d{3,}";
,指至少重复3次防止过度匹配
eg:
文本:<B>AK</B>and<B>HI</B>
正则表达式:reg="<[Bb]>.*</[Bb]>";
,*和+都是所谓的贪婪型元字符
匹配结果:**<B>AK</B>and<B>HI</B>**
正则表达式:reg="<[Bb]>.*?</[Bb]>";
,*和+都是所谓的贪婪型元字符
匹配结果:**<B>AK</B>** **<B>HI</B>**
其中,?是*和+的懒惰型版本
位置匹配
边界
eg:
文本:The cat s**cat**tered his food all over the room
正则表达式:reg="cat";
匹配结果:cat cat
即将单词中的cat也匹配出来了单词边界
eg:
文本:The cat scattered his food all over the room
正则表达式:reg="\bcat\b";
匹配结果:cat
\b匹配的是这样一个位置,这个位置位于一个能够用来构成单词的字符(字母、数字和下划线,也就是与\w相匹配的字符)和一个不能用来构成单词的字符(也就是与\W相匹配的字符)之间
eg:
文本:nine-digit color - coded
正则表达式:reg="\B-\B";
匹配结果:-
\B匹配一个前后都不是单词边界的字符字符串边界
一个用来定义字符串边界的元字符有两个:一个是用来定义字符串开头的^,一个是用来定义字符串结尾的$
eg:reg="^\s*<\?xml.*\?>";
eg:reg="</[Hh][Tt][Mm][Ll]>\s*$";
分行匹配模式
eg:reg="(?m)^\s*//.*$";
把换行符视为一个字符串分隔符
元字符序列(?m)把行分隔符当做一个字符串分隔符来对待,(?m)必须出现在整个模式的最前面。在分行匹配模式下,^不仅匹配正常的字符串开头,还将匹配行分隔符(换行符)后面的开始位置;$不仅匹配正常的字符串结尾,还将匹配行分隔符(换行符)后面的结束位置
使用子表达式
子表达式
eg:reg="( ){2,}";
子表达式必须用(和)括起来,其中(和)是元字符
eg:reg="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}";
等价于reg="(\d{1,3}\.){3}\d{1,3}";
eg:reg="(19|20)\d{2}";
匹配19或者20开头的4位数字子表达式的嵌套
eg:reg="(((\d{1,2})|(1\d{2})|(2([0-4])\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2([0-4])\d)|(25[0-5]))";
匹配合法的IP地址
回溯引用-前后一致匹配
回溯引用匹配
eg:reg="[ ]+(\w+)[ ]+\1";
其中\1代表模式里的第一个子表达式,他引用的是前面划分出来的第一个子表达式,\2代表第二个子表达式,\3代表第三个,依次类推
eg:reg="<[Hh][1-6]>.*?</[Hh]\1>";
\1只匹配与之相同的数字回溯引用在替换中的应用
eg:
文本:hello,ben@forta.com is my email address.
`reg=”(\w+[\w.]*@[\w.]+.\w+)”;
rep=”“;
结果:ben@forta.com is my email address.大小写转换
字符集 说明 \E 结束\L或\U转换 \l 把下一个字符转换为小写 \L 把\L到\E之间的字符全部转换为小写 \u 把下一个字符转换为大写 \U 把\U到\E之间的字符全部转换为大写
前后查找
-向前查找
一个向前查找模式就是一个以?=开头的子表达式,需要匹配的文本跟在=的后面
eg:reg=".+(?=:)";
匹配:之前的一个或多个字符。?=意思指只要找到:就行了,不要把它包括在最终的匹配结果里,就是不消费它
-向后查找
一个向前查找模式就是一个以?<=开头的子表达式,需要匹配的文本跟在=的后面
eg:reg="(?<=:).+";
匹配:之后的一个或多个字符。只要找到:就行了,不要把它包括在最终的匹配结果里,就是不消费它
-把向前查找和向后查找结合起来
eg:reg="(?<=<[Tt][Ii][Tt][Ll][Ee]>).*(?=</[Tt][Ii][Tt][Ll][Ee]>)";
匹配与之后的零个或多个字符
-对前后查找取非
操作符 | 说明 |
---|---|
(?=) | 正向前查找 |
(?!) | 负向前查找 |
(?<=) | 正向后查找 |
(? | 负向后查找 |
嵌入条件
回溯引用条件
eg:reg="(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}";
其中?(1)判断第一个子表达式是否存在,如果(1)存在,则必须要匹配其后的字符,如果(1)不存在,则必须匹配|后的字符。(?(1))|-)是一个回溯引用条件前后查找条件
eg:reg="\d{5}(?(?=-)-\d{4})";
其中?(?=-)判断(?=-)子表达式是否存在,如果存在,则必须要匹配其后的字符。(?(?=-)-\d{4})是一个前后查找条件
附正则表达式搜索和替换的相关代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex {
public static void main(String[] args)
{
String str = "hello,ben@forta.com is my email address.";
//正则表达式
String reg = "(\\w+[\\w\\.]*@[\\w\\.]+\\.\\w+)";
//替换
String rep = "<A HREF=\"mailto:$1\">$1</A>";
Matcher m = Pattern.compile(reg).matcher(str);
//打印匹配到的字符
while(m.find())
{
System.out.println(m.group());
}
//打印替换后的字符串
System.out.println(m.replaceAll(rep));
}
}