转义字符
标准字符集合
- 能够与’多种字符’匹配的表达式
- 注意区分大小写,大写是相反的意思
自定义字符集合
- 正则表达式的特殊符号,被包含到中括号中去,则失去特殊意义,除了^,-之外
- 标准字符集合,除小数点外,如果被包含于中括号,自定义字符集合将包含该集合。比如:[\d.\-+]将匹配数字、小数点、-、+
量词
- 匹配次数中的贪婪模式(匹配字符越多越好,默认)
- 匹配次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个“?”号)
字符边界
- 本组标记匹配的不是字符而是位置,符合某种条件的位置
- \b匹配这样一个位置:前面的字符和后面的字符不全是\w
正则表达式的匹配模式
选择符和分组
反向引用(\nnn)
- 每一对()会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号
- 通过反向引用,可以对分组已捕获的字符串进行引用
([a-z]{2})\1
预搜索(零宽断言)
[a-z]+(?=ing)
[a-z]+(?!\d+)
[a-z]+(?<=go)
[a-z]+(?<!go)
练习(电话号码)
(0\d{2,3}-\d{7,8})|(1[358]\d{9})
练习(邮箱)
[\w\-]+@[a-zA-Z0-9]+(\.[A-Za-z]{2,4}){1,2}
java中的正则表达式
/**
* 正则表达式的使用
* @author L J
*/
public class RegexDemo {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\w+");
Matcher m = p.matcher("sdjfign@90384");
while(m.find()) {
System.out.println(m.group());
}
}
}
/**
* 正则表达式的用法(分组)
* @author L J
*/
public class RegexDemo2 {
public static void main(String[] args) {
Pattern p = Pattern.compile("([a-z]+)([0-9]+)");
Matcher m = p.matcher("sdj23**hhf89**jfj443");
while(m.find()) {
System.out.println(m.group());
System.out.println(m.group(1));
System.out.println(m.group(2));
}
}
}
/**
* 正则表达式的用法(替换)
* @author L J
*/
public class RegexDemo3 {
public static void main(String[] args) {
Pattern p = Pattern.compile("[0-9]");
Matcher m = p.matcher("sdj23**hhf89**jfj443");
String newStr = m.replaceAll("/");
System.out.println(newStr);
}
}
/**
* 正则表达式的用法(分割)
* @author L J
*/
public class RegexDemo4 {
public static void main(String[] args) {
String str = "sdj23hhf89jfj443";
String[] arrs = str.split("\\d+");
System.out.println(Arrays.toString(arrs));
}
}
网络爬虫原理
/**
* 网络爬虫取链接
* @author L J
*/
public class WebSpider {
public static void main(String[] args) {
String str = getURLContent("http://www.163.com", "gbk");
List<String> result = getMatcherSubstrs(str, "href=\"([\\w\\s./:]+?)\"");
for (String r : result) {
System.out.println(r);
}
}
public static List<String> getMatcherSubstrs(String destStr, String regex) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(destStr);
List<String> result = new ArrayList<String>();
while(m.find()) {
result.add(m.group(1));
}
return result;
}
/**
* 通过url获得网页源码
* @param urlStr url地址
* @return 源码
*/
public static String getURLContent(String urlStr, String charset) {
StringBuilder sb = new StringBuilder();
try {
URL url = new URL(urlStr);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), Charset.forName(charset)));
String temp = "";
while((temp = reader.readLine()) != null) {
sb.append(temp);
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
}