字符{数量}位置 例如: [0,9]{2,4}\b 可以匹配 123 34 5678 1988
• \d 表示数字,相当于[0-9] • \D 表示非数字,相当于 [^0-9] • \s 表示空白符,相当于 [ \t\n\x0B\f\r] • \S 表示非空白符,相当于[^\s] • \w 表示单词字符,相当于 [a-zA-Z_0-9] • \W 表示非单词字符,相当于 [^\w]
匹配html源代码中的网址可用以下正则表达式: \b(href)=('[^']+') 匹配出来网址的字符串表示一般为: href=’https://www.baidu.com’ href=’https://www.google.com.tw’ 等等。 对以上正则表达式的解释: 首先\b表示单词边界的意思,意思是说对于(href)来说,其前面为空格、’<’等非字母字符,而接下来的(href)来说,意思是说(href)作为子表达式分组匹配,那么表达式到现在将会匹配href…字符,而=是一个普通字符,原样匹配。再来就是另外一个子表达式('[^']+'),这个表达式的意思即是:一开始是匹配一个',然后[^']是要匹配非'字符(^的意思是非),紧接着的+是指匹配一个或多个这样的字符,即是要匹配aaa,a123,b23df这样的字符串。而后则继续是匹配一个',到这里完成一个对网址匹配的正则表达式的书写。
例如:对以逗号或空白符分隔的输入字符串进行切分
import java.util.regex.*; public class RegexSplitter { public static void main(String[] args) throws Exception { Pattern p = Pattern.compile( "[,\\s]+"); String[] result = p.split( "one,two, three four , five "); for (int i = 0; i < result.length; i++) { System.out.println(result[i]); } } }程序输出结果: 对以上正则匹配的解释:[,\\s]+,其中[]中的内容表示要匹配的字符,因为对于特殊字符需要转义才能正常显示,因此对'\s'需要转义,而[]后面接着+,说明匹配一个或多个这样的字符。 补充:\s表示空白符,在Java中空白符为以下字符: \t\n\x0B\f\r (第一个字符为空格) \t为制表符,即Tab; \n为换行字符; \x0B与Tab原理一样,不过是垂直方向的; \f为换页字符; \r为回车字符。 其中 空格符 制表符 换行符最常用 在C语言中(不知道为什么java输出正常): \r 回车就是回到当前行的行首,并且会覆盖当前行的输出 \n 回车并换行另起一行,并回到另起一行的行首。
例如:判断一个email地址是否合法
import java.util.regex.*; public class RegexEmailValidate { public static void main(String[] args) throws Exception { String pattern = "^[^@]+@[\\w]+(\\.[\\w]+)+$"; String email1 = "adherersun@163.com"; String email2 = "@@@adherersun@163.com"; String email3 = "adherersun@163"; boolean ok1 = Pattern.matches( pattern, email1 ); boolean ok2 = Pattern.matches( pattern, email2 ); boolean ok3 = Pattern.matches( pattern, email3 ); System.out.println( "email1 is " + ok1 ); System.out.println( "email1 is " + ok2 ); System.out.println( "email1 is " + ok3 ); } }程序输出结果: 说明:单个的^字符表示匹配起始位置,而$表示匹配的结束位置
通过调用某个模式(Pattern对象)的matcher方法可以得到Matcher对象
1.find方法将扫描输入序列,寻找下一个与模式匹配的地方. 2.利用appendReplacement方法.
1.所谓group(分组),是指正则表达式中一对圆括号括起来的一部分. 2.group(0)或group()表示整个正则表达式匹配项,group(1)、group(2)…表示各个分组. 3.替换时,$0表示整个匹配项, $1,$2…表示各个分组(圆括号).
import java.util.regex.*; public class RegexReplacement { public static void main(String[] args) throws Exception { Pattern pattern = Pattern.compile("cat"); Matcher matcher = pattern.matcher( "one cat, two cats in the yard"); StringBuffer sb = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sb, "big $0"); } matcher.appendTail(sb); System.out.println(sb.toString()); } }关于这个程序中使用的方法的解释将在正则表达式第二篇的学习中涉及到。 一个从网页内容中找到链接网址的小例子:
import java.util.regex.*; public class RegexHref { public static void main(String[] args) throws Exception { String patternString = "\\s*(href|src)\\s*=\\s*(\"([^\"]*\")|(\'[^\']*\')|([^\'\">\\s]+))"; String text = "<a href=\"http://aaa.htm\">bbb</a> <img src=\"http://bb.com/pic.jpg\">"; Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher( text ); StringBuffer buffer = new StringBuffer(); while (matcher.find()) { //整个捕获,相当于goup(0) buffer.append("获捕到" + matcher.group()); //捕获中的一部分(第2对圆括号对应的,即是网址) buffer.append(" 其中网址为" + matcher.group(2)); buffer.append("\r\n"); } System.out.println(buffer.toString()); } }程序输出结果: 未完待续见Java正则表达式学习(二)
