一、正则表单式的作用
1.1 校验内容的有效性
String str = "163yin.weiwei@qq.com";
String regex = "^[\\w-]+(\\.[\\w-]+)*@([\\.\\w-]+)+$";
boolean result = Pattern.matches(regex, str);
1.2 替换内容
示例1:将url解析为a标签
String str = "这是测试的文本[url = baidu.com]百度[/url],结束";
String pattern = "\\[url\\s+=\\s+(.*?)\\](.*?)\\[\\/url\\]";
str = str.replaceAll(pattern, "<a href='$1'>$2</a>"); // $1, $2是指pattern中第一对小括号和第二对小括号匹配的内容,序号从1开始
System.out.println(str); // 这是测试的文本<a href='baidu.com'>百度</a>,结束
示例2:将远程地址网页内容中的src和href的内容前面添加远程url的地址
String urlParent = url.substring(0, url.lastIndexOf("/")+1);
String pattern = "(\\s+)src=\"((?!http[s]?:)[./]*[a-zA-Z0-9._\\-\\/]+)";
content = content.replaceAll(pattern, "$1src=\"" + urlParent + "$2");
pattern = "(\\s+)href=\"((?!http[s]?:)[./]*[a-zA-Z0-9._\\-\\/]+)";
content = content.replaceAll(pattern, "$1href=\"" + urlParent + "$2");
return content;
1.3 获取内容
示例1: 获取title的值
String str = "<a href=\"/book/1485278.html\" title=\"Think in Java\">";
Pattern p = Pattern.compile("title=\"(.*?)\"");
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println(m.group(1)); // 输出 Think in Java
}
示例2:解析出某些位置的文字
String str = "{if(a=1)}a等于1{endif}这是混淆的文字{if(a>5)}a大于5{endif}结束";
String matcher="\\{if\\((.*?)\\)\\}(.*?)\\{endif\\}";
List<List<String>> analysis = analysis(matcher, str); //[[a=1, a等于1], [a>5, a大于5]]
public static List<List<String>> analysis(String matcher, String str) {
List<List<String>> list = new ArrayList<List<String>>();
Matcher m = Pattern.compile(matcher).matcher(str);
while (m.find()) {
List<String> row = new ArrayList<>();
for (int i = 0; i < m.groupCount(); i++) {
row.add(m.group(i + 1));
}
list.add(row);
}
return list;
}
二、正则表达式的语法
* 匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次
? 匹配前面的子表达式零次或一次
{n} n 是一个非负整数。匹配确定的 n 次
{n,} n 是一个非负整数。至少匹配n 次
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。
[a-z] 字符范围。匹配指定范围内的任意字符
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
^[a-zA-Z]\w{5,17}$ 以字母开头,长度在6~18之间,只能包含字符、数字和下划线
更多细节请参考http://www.cnblogs.com/Mainz/archive/2009/03/14/1411359.html
[\w-]是什么意思? \w 匹配任意单词字符 - 匹配-,即匹配 任一单词字符或一个 -
[\w]+和\w+没有区别,都是匹配数字和字母下划线的多个字符
[\w+]表示匹配数字、字母、下划线和加号的单个字符
可以使用在线工具对正则表达式进行验证,如http://tool.oschina.net/regex/
本文内容到此结束。