string中有三个方法支持正则
第一个,split()方法,能够对匹配到的字符,做分割
第二个,matches()方法,判读该字符串匹不匹配该正则,如果不匹配就返回false;
第三个,replaceAll()方法,从字符串中找到匹配的字符串,做替换
Pattern类是java对正则的解释器,采用的是解释器模式,通常Pattern与Matcher要配合使用
首先,通过Pattern编译一个正则表达式,然后编译之后获取一个Pattern对象,在通过Pattern对象调用matcher(string s)方法对字符串进行匹配,获取到Matcher对象,matcher对象有一系列的匹配方法来对字符传进行匹配
find()方法,从字符串中找符合正则的字符串,找到了返回true;
group()方法,返回匹配到的字符串结果,要配合find()方法使用;不然就会报错
groupCount()方法,返回有多少个匹配结果
replaceAll(String str)方法,替换掉符合正则表达式的字符串为str
replaceFirst(String str)方法,替换第一个符合正则表达式的字符串为str
lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
Java代码示例:
Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("22bb23"); m.lookingAt();//返回true,因为\d+匹配到了前面的22 Matcher m2=p.matcher("aa2223"); m2.lookingAt();//返回false,因为\d+不能匹配前面的aa
Mathcer.start()/ Matcher.end()/ Matcher.group()
当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以上三个方法得到更详细的信息.
start()返回匹配到的子字符串在字符串中的索引位置.
end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
group()返回匹配到的子字符串
Java代码示例:
Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("aaa2223bb"); m.find();//匹配2223 m.start();//返回3 m.end();//返回7,返回的是2223后的索引号 m.group();//返回2223 Mathcer m2=m.matcher("2223bb"); m.lookingAt(); //匹配2223 m.start(); //返回0,由于lookingAt()只能匹配前面的字符串,所以当使用lookingAt()匹配时,start()方法总是返回0 m.end(); //返回4 m.group(); //返回2223 Matcher m3=m.matcher("2223bb"); m.matches(); //匹配整个字符串 m.start(); //返回0,原因相信大家也清楚了 m.end(); //返回6,原因相信大家也清楚了,因为matches()需要匹配所有字符串 m.group(); //返回2223bb
捕获组的概念
捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:
1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C)
组零始终代表整个表达式。 以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。
与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串"aba" 与表达式(a(b)?)+ 相匹配,会将第二组设置为 "b"。在每个匹配的开头,所有捕获的输入都会被丢弃。
Pattern p=Pattern.compile("([a-z]+)(\\d+)"); Matcher m=p.matcher("aaa2223bb"); m.find(); //匹配aaa2223 m.groupCount(); //返回2,因为有2组 m.start(1); //返回0 返回第一组匹配到的子字符串在字符串中的索引号 m.start(2); //返回3 m.end(1); //返回3 返回第一组匹配到的子字符串的最后一个字符在字符串中的索引位置. m.end(2); //返回7 m.group(1); //返回aaa,返回第一组匹配到的子字符串 m.group(2); //返回2223,返回第二组匹配到的子字符串
注意:只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用.
匹配中文字符的正则表达式: "[u4e00-u9fa5]"
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):"[^x00-xff]"
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:"\n\\s\r"
评注:可以用来删除空白行
匹配HTML标记的正则表达式:"<(\\S*?)[^>]*>.*?|<.*? />"
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:"^\\s*|\\s*$"
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:"\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*.\\w+([-.]\\w+)*"
评注:表单验证时很实用
匹配网址URL的正则表达式:"[a-zA-z]+://[^\\s]*"
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):"^[a-zA-Z][a-zA-Z0-9_]{4,15}$"
评注:表单验证时很实用
匹配国内电话号码:"\\d{3}-\\d{8}|\\d{4}-\\d{7}"
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:"[1-9][0-9]{4,}"
评注:腾讯QQ号从10000开始
匹配中国邮政编码:"[1-9]\\d{5}(?!\\d)"
评注:中国邮政编码为6位数字
匹配身份证:"\\d{15}|\\d{18}"
评注:中国的身份证为15位或18位
匹配ip地址:"\\d+.\\d+.\\d+.\\d+"
评注:提取ip地址时有用