一、正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种字串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式是一个字符串,用来描述匹配一个字符串集合的模式。对于字符串处理来说,正则表达式是一个强大的工具。可以使用正则表达式来匹配、替换和分割字符串。
例如:
-
runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
-
runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
-
colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
二、
1、匹配字符串
从String类中的matches方法看,matches方法很类似于equals方法,但是matches方法更强大,它不仅可以匹配一个固定的字符串,还可以匹配符合一个模式的字符串集。
“Java is fun”.matches("Java.*");
"Java is cool".matches("Java.*");
"Java is powerful".matches("Java.*");
语句中的"Java.*"是一个正则表达式。它描述了一个字符串,以Java开始,后面跟0或多个字符串。这里,子字符串.*匹配0或者多个任意字符。
2、正则表达式语法
正则表达式由字面值字符和特殊符号组成。
注:反斜杠是一个特殊的字符,在字符串中开始转义序列。因此Java中需要用\来表示。
(1)空白字符是' '、't'、'n'、'r',或者'f'。因此,s和[tntf]等同,S和[^ tnrf]等同。
(2)单词字符是任何的字母,数字或者下划线字符。因此w等同于[a-z[A-Z][0-9]_]或者简化为[a-Za-z0-9]。
(3)表中后面六个条目*、+、?、{n}、{n, }以及{n,m}称为量词符,用于确定量词符前面的模式会重复多少次。例如,A*匹配0或者多个A,A+匹配1或者多个A,A?匹配0或者1个A。A{3}精确匹配AAA,A{3, }匹配至少3个A,A{3,6}匹配3到6之间个A。*等同{0,},+等同于{1,},?等同于{0,1}。
(4)不要在重复量词符中使用空白。例如,A{3,6}不能写成逗号后面有一个空白符的A{3, 6}。
(5)可以使用括号来将模式进行分组。例如:(ab){3}匹配ababab,但是ab{3}匹配abbb。
3、替换和拆分字符串
如果字符串匹配正则表达式,String类的matches方法返回true。String类也包含repalceAll,replaceFirst和split方法,用于替换和拆分字符串
repalceAll方法替换所有匹配的子字符串,replaceFirst方法替换第一个匹配的子字符串,。
例如:
System.out.println("Java Java Java".replaceAll("v\w","wi"));
显示:Jawi Jawi Jawi
System.out.rpintln("Java Java Java".replaceFirst("v\w","wi"));
显示:Jawi Java Java
有两个重载的split方法,split(regex)方法使用匹配的分隔符将一个字符串拆分为子字符串。
eg.
String[] tokens = "Java1HTML2Perl".split("\d");将字符串拆分为Java、HTML、Perl并且保存在tokens[0],tokens[1]以及tokens[2]中。
在split(regex,limit)方法中,limit参数确定匹配多少次。如果limit > 0,模式最多匹配limit - 1次。
注:默认情况下,所有的量词符都是“贪婪”的。这意味着它们会尽可能匹配最多次。



