正则表达式:
字符串匹配的模式:可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
标准字符集合:
\d代表任意一个数字 0~9内任意一个(\D则代表除了数字外的所有字符,相当于取反)
\w任意一个字母或数字或下划线 即AZ,az,0~9,_中任意一个
\s包括空格,制表符,换行符等空白字符
. 小数点可以匹配任意一个字符(除了换行符\n)
自定义字符集合:
正则表达式特殊符号被包含到中括号,则失去特殊意义(除了^,-之外)
[5abc]匹配“5”或“a”或“b”或“c”
[^ abc]匹配“a”“b”“c”外任意一个字符
[f-k]匹配“f”~“k”之间任意一个字母
[^f-k0-3]匹配“f”“k”,“0”“3”之外的字符
量词
\d{6}匹配重复6次的数字字符
\d{3,6}匹配至少重复3次,至多6次的数字字符集,默认贪婪模式,尽量匹配6次的
\d{3,6}? 非贪婪模式,优先匹配3次的。
?匹配表达式至少0次或1次,相当于{0,1},与上一行的{}?区别开
+匹配至少出现一次,相当于{1,}
*匹配不出现或出现任意次,相当于{0,}
a\d?b:代表ab,a3b这种ab之间有一个或0个字符的字符集
字符边界:
0宽度匹配位置
^ 与字符串开始的地方匹配
& 与字符串结束的地方匹配
\b 匹配一个单词边界
正则表达式匹配模式:
忽略大小写模式
单行模式:整个文本看作一个字符串
多行模式:每一行看作一个字符串
选择符和分组:
-
| 竖线表于示 或
-
捕获组()使用:
反向代理:
([a-z]{2})\1 :()表示2个字母为一组,\1表现第一个括号内的内容再重复一次(这里只有一个括号) 例如:gogo dodo scsc
‘\1’ 匹配的是 所获取的第1个()匹配的引用。
例如,’(\d)\1’ 匹配两个连续数字字符。如33aa 中的33
‘\2’ 匹配的是 所获取的第2个()匹配的引用。
例如,’(\d)(a)\1’ 匹配第一是数字第二是字符a,第三\1必须匹配第一个一样的数字重复一次,也就是被引用一次。如9a9 被匹配,但9a8不会被匹配,因为第三位的\1必须是9才可以。
预搜索(零宽断言):
(?=exp)断言自身出现位置后面能匹配表达式exp
(?<=exp)断言自身出现位置前面能匹配表达式exp
(?!exp)断言此位置后不能匹配表达式exp
(?<!exp)断言此位置前不能匹配表达式exp
例如:[a-z]+(?=ing):找到了以ing结尾前的字母,比如doing前的do,但ing不匹配,所以是0宽度
[a-z]+(?!\d+):后面不存在数字的字母,例如abc123就不行
一些正则表达式小例子:
(0\d{2,3}-\d{7,9})匹配以0开头+两到三位数字+中间有横杠+七到九位数字的座机号码:010-8889999
(1[35789]\d{9})匹配手机号:1开头+35789中一位数字为第二位+九位任意数字
例如网址URL,QQ号,身份证遇到需要匹配的时候去百度
java内使用正则表达式的一些方法:
public class Demo01 {
public static void main(String args[]){
//方法一:匹配查找
//表达式对象:将正则表达式变为一个对象
Pattern p=Pattern.compile("\\w+");
//创建Matcher对象,将正则表达式与待匹配的字符串关联
Matcher m=p.matcher("abcdefg123");
boolean yesorno=m.matches();//返回ture
System.out.println(m.group());//返回该字符串
boolean yesorno2=m.find();//该方法扫描序列,查找是否于该模式匹配的下一个子序列
//方法二:替换
m.replaceAll("new");//把匹配的字符串替换,生成新字符串
//方法三:分割复杂的字符串
String str="a123b456c789";
String[] arrs=str.split("\\d+");//以字母来分割字符串
System.out.println(Arrays.toString(arrs));
}
}
练习: 利用正则表达式网络爬虫:
/*网络爬虫取链接*/
public class WebSpider {
public static void main(String[] args) {
String str = GetStringFromUrl("http://www.163.com", "gbk");
String regexstr1="<a.+?</a>";//获得文本内超链接的内容,例如<a href="http://sitemap.163.com/">网站地图</a>
String regexstr2="href=\".+?\"";//引号需要转义字符 //获得文本内超链接的地址,得到href="http://sitemap.163.com/"
String regexstr3="href=\"(.+?)\"";//加上分组 可以得到http://sitemap.163.com/
List<String> l= getAimStr(str,regexstr3);
for(String s:l){
System.out.println(s);
}
}
public static List<String > getAimStr(String deststr,String regexstr){//两个参数,一个带检索的文本,一个是正则表达式字符串
List<String> list=new ArrayList<>();
Pattern p=Pattern.compile(regexstr);
Matcher m=p.matcher(deststr);
while(m.find()){
// System.out.println(m.group(1));
list.add(m.group(1));//若正则表达式内不存在括号则m.group()
}
return list;
}
public static String GetStringFromUrl(String path,String charsetName){//通过URL爬取网页代码
StringBuilder info = new StringBuilder();
try {
URL url=new URL(path);
BufferedReader reader=new BufferedReader(new InputStreamReader(url.openStream(),charsetName));
String temp="";
while((temp=reader.readLine())!=null){
// System.out.println(temp);
info.append(temp);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return info.toString();
}
}