说明 :
主要用于复杂的文本,我们可以把它看成是一门小的语言;
Topic 1 :基础知识
1 . 普通字符
就是匹配与其相同的字符
2 . 转义字符
也是匹配与之相同的字符;
3 . 标准字符集
注意:
\d匹配的是一个;
注意区分大小写,大写是相反的意思;
如\D 就是匹配的所有的非数字;
.是匹配所有的字符但是不能匹配换行符(\n);
[\s\S]可以包含所有的字符是因为:
\s是包含换行符的
\S是指除了\s之外的所有字符就包含了所有的字符;
4 . 自定义字符集合:
就像一个集合匹配集合里面的所有东西;
【a-f3-9】匹配a到f和3到9;
特殊符号被包含在[]中就取消了特殊意义除了^和-之外;
所以我们要是想查找^和-那么我们就要在前面加\转义字符;
例如:
所以:标准字符集是不会取消其含义的;
5 . 量词 : 修饰匹配次数的特殊符号;
\d{6} 匹配6位
\d\d{6} 匹配7位
(\d\d){6} 匹配12位
\d{3,6}三位到六位 (这里默认的是贪婪模式)
\d{3,6}?非贪婪模式
\d(3,)最少三次
但是没有\d(,6)最多六次;
a\d?b 可以匹配 ab a1b 就是a与b之间可以有一个数字或没有数字;
这三个很常用重要;
6 . 字符边界:
他是零宽度;(他匹配的是一个位置而不是符号);
\d这个是非零宽的因为他胡匹配到字符;
\b表示匹配的是前面的字符和后面的字符不全是\w;(\w就是表示字母 数字 下划线);
例:
aha\b
aha aha1 aha12 123aha
上面这四个可以匹配的是1,4;
注意不全是的反义词就是全是;
aha1 左边是a右边是1全是\w所以不匹配;aha12亦然;
而123aha左边是a可以 右边是空格不可以 所以他就是匹配的;
7 . 正则表达式的匹配模式
8 . 选择符和分组 :
9 . 反向引用 :
我们的反向引用一般都与()捕获相结合
例如:
([a-z]{2})\1
这个表达是就会匹配到 ahah aiai
解析: ()里面就是匹配到a-z的随意的两个字母捕获以后 然后反向引用我们第一次捕获的的这个字符串在重复一次 就像aoao就能匹配到;
\1就是第一个括号里捕获的东西;
(?:表达式)这个意思就我们只是用括号的组织的作用就是不使用他捕获的内容;
因为我们捕获组捕获的东西要翻到内存里面,所以非捕获组就不浪费内存;
10 . 零宽断言(预搜索)
exp指的是express 就是一个表达式;
强调一下 这个说的是位置;
第一个语法的示例:
[a-z]+(?=ed)
他的作用就是匹配所有以ed结尾的单词 wanted
但是呢他匹配的内容是不包括ed的 他会匹配到want而不是wanted;
那么匹配以数字结尾的字符串就是 [a-z]+(?=\d+);
与其对应的就是第三个
[a-z]+(!?=ed)
匹配后面不是ed结尾的单词;
第二个和第四个就是指前面应该怎么样和前面不能怎么样;
Topic 2 :简单的小练习
1.电话号码的验证
解析电话号码分为固话和手机号
直接写出来不详细解析了 因为太简单了
固话:0\d{2,3}-\d{7,8}
手机号: 1[35789]\d{9}
结合起来:
0\d{2,3}-\d{7,8}|1[35789]\d{9}
2 . 邮箱的验证
[\w\-]+@[a-zA-Z0-9]+(\.[A-Za-z]{2,4}){1,2}
解析:
前面是用户名可以是字符字母下划线或中划线若干个组成 然后是@ 然后是.com或者是.cn或者是.com.cn;
Topic 3 :正则在java中的使用
代码示例:
public static void main (String[] args) {
//我们在这里测试一个字符串asd123&&asads和\w+的匹配
//在这里我们的\w在java中的使用都要加一个\就是变成\\w
//建立一个表达式对象
Pattern p = Pattern.compile("\\w+");
//建立一个Matcher对象
Matcher m = p.matcher("asd123&&asads");
//让二者进行匹配 会返回一个boolean类型的变量
// boolean b = m.matches();
// System.out.println(b);
// m.find() 会返回是否找到一个符合表达式的字符是boolean类型
// m.group() 是返回m.find找到的那个字符串 所以呢要先调用m.find才能调用m.group
System.out.println(m.find());
System.out.println(m.group(0));
// while(m.find()){
// System.out.println(m.group()); //group(),group(0)匹配整个表达式的子字符串
// System.out.println(m.group(0));
// }
}
//输出结果为
//asd123
//asd123
//asd
//123
//asssas12332
//asssas12332
//asssas
//12332
// 由此可见我们的group()和(0)是匹配的子串 而(1)(2)是子串的符合第一个表达式的子串符合第二个表达式的子串
public static void main (String[] args) {
//创建一个正则表达式
Pattern p = Pattern.compile("([a-z]+)([0-9]+)");
//创建一个对象
Matcher m = p.matcher("asd123&&asssas12332**asd");
while (m.find()) {
System.out.println(m.group());
System.out.println(m.group(0));
System.out.println(m.group(1));
System.out.println(m.group(2));
}
}
public static void main(String[] args) {
//表达式对象
Pattern p = Pattern.compile("[0-9]");
//创建Matcher对象
Matcher m = p.matcher("aa232**ssd445*sds223");
//替换 把符合这个正则表达式的都替换为我们制定的文本
String newStr = m.replaceAll("#");
System.out.println(newStr);
//遇到字符串的拼接我们就会想到字符串的拼接什么的都是新建的一个字符串 字符串是不可改变的
}
public static void main(String[] args) {
//字符串的分割
String str = "a232b4334c3434";
//把符合正则的都去掉在把其他的变为一个个数组的元素
String[] arrs = str.split("\\d+");
System.out.println(Arrays.toString(arrs));
}
常用正则表达式匹配列表:
注意:
要是常用的正则表达式你不会写可以百度一下试试;
网络爬虫:
package Test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* 这里我们写一个网络爬虫
* 爬取163里面的超链接的内容
* @author wangtong
*
*/
public class Web {
/**
* 获得urlStr对应的网页的源码内容
* @param urlStr
* @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 (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
public static List<String> getMatherSubstrs(String destStr,String regexStr){
Pattern p = Pattern.compile(regexStr); //取到的超链接的地址
Matcher m = p.matcher(destStr);
List<String> result = new ArrayList<String>();
while(m.find()){
result.add(m.group(1));
}
return result;
}
public static void main(String[] args) {
String destStr = getURLContent("http://www.163.com","gbk");
// Pattern p = Pattern.compile("<a[\\s\\S]+?</a>"); //取到的超链接的整个内容
List<String> result = getMatherSubstrs(destStr, "href=\"([\\w\\s./:]+?)\"");
for (String temp : result) {
System.out.println(temp);
}
}
}