一:普通字符
1、字母、数字、汉字、下划线以及没有特殊定义的标点符号,都是"普通字符"。表达式中的
普通字符,在匹配一个字符串时,匹配与之相同的一个字符。
2、简单的转义字符:与C语言,java中的转义字符一样
\n 代表换行符
\t 代表制表符
\\ 代表本身
.......
二:标准字符集:能够与'多种字符'匹配的表达式(注意区分大小写,大写是相反的意思)
1、\d 0-9中的任意一个数字 (\D:就是不是0-9中任意一个字符)
2、\w 任意一个字母、数字、下划线。包括大小写
3、\s 包括空格、制表符、换行符等空白字符中的任意一个
4、. 匹配除了"\n"外的任意一个字符。(如果要包括"\n",一般用[\s\S])
三:自定义字符集合:[]方括号匹配方式,能够匹配方括号中的任意一个字符
1、[ab5@] 表示匹配"a"或"b"或"5"或"@"
2、[^abc] 匹配除了"a","b","c"之外的任意一个字符
3、[f-k] 匹配"f"到"k"之间的任意一个字符
4、[^f-k0-3] 匹配除了"f"-"k",0-3之外的任意一个字符
注意:
1、正则表达式中的特殊符号,被包含于括号中,将失去特殊意义,除了^,-之外
2、标准字符集,除了.以外,如果被包含于[]中,自定义字符集合将包含该集合
eg:[\d.-+]将匹配:数字、".","+","-"
这里+号失去了量词中的特殊意义,.号失去了标准字符集中的特殊意义
四:量词(Quantifier):修饰匹配次数的特殊符号
1、{n} 表达式重复n次
2、{m,n} 表达式至少重复m次,最多重复n次
3、{m,} 表达式至少重复m次
4、? 匹配表达式0次或者1次,相当于{0,1}
5、+ 表达式至少出现一次,相当于{1,}
6、* 表达式不出现或者出现任意次,相当于{0,}
匹配次数中的贪婪模式:匹配字符越多越好,这是默认形式。
匹配次数中的非贪婪模式:匹配次数越少越好,在匹配次数的特殊符号后面加上一个"?"号
五:字符边界:本组标记匹配不是字符而是位置,符合某种条件的位置
1、^ 与字符串开始的地方匹配
2、$ 与字符串结束的地方匹配
3、\b 匹配一个单词边界
\b匹配这样一个位置:前面的字符和后面的字符不全是\w
六:正则表达式的匹配模式:
1、忽略大小写模式:默认情况下正则表达式是要区分大小写的,按下Case insensitive键就可以了
2、单行模式:整个文本看做一个字符串,只有一个开头,一个结尾。使"."可以 匹配\n在内的任意字符
3、多行模式:每一行都是一个字符串,都有开头和结尾。在指定了多行模式之后,如果需要仅匹配字符串
开始和结尾的位置可以使用\A和\Z
七:选择符和分组
1、| 分支结构 左右两边表达式是或的关系
2、()捕获组
1)、再被修饰匹配次数时,括号中的表达式可以看做整体来处理
2)、取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
3)、每一对括号分配一个编号,使用()的捕获组根据左括号的顺序从1开始自动编号。捕获元素编号为0的第一个捕获组是由整个正则表达式模式匹配的文本。
3、(?:exp)非捕获组:一些表达式中,不得不使用(),但又不需要保存()中子表达式匹配
的内容,这时可以用非捕获组来抵消使用()带来的副作用。
反向引用(\nnn)
1)、每对()会分配一个编号,使用()的捕获组根据左括号的顺序从1开始自动编号
2)、通过反向引用,可以对分组已捕获的字符串进行引用
eg:([a-z]{2})\1 可以匹配到如:gogo toto dodo
这里的解释是:()是匹配到的内容,\1是对该内容的引用。
([a-z]{2})\1{2}对内容引用两次 可以匹配到:gogogo tototo dododo等
(?:[a-z]{2})\1 没有匹配到的内容,因为()中的内容并不保存到内存中,因此无法引用
八:预收索:
1、只进行子表达式的匹配,匹配内容不计入最终结果,是0宽度
2、这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定的条件。
3、正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中
那么就认为整个子表达式是占有字符的;如果子表达式匹配到的仅仅是位置,或者匹配到内容
并不保存到最终的匹配结果中,那么就认为这个子表达式是0宽度的。
(?=exp) 断言自身出现的位置的后面能匹配表达式exp
(?<=exp)断言自身出现的位置的前面能匹配表达式exp
(?!exp) 断言自身出现的位置的后面不能匹配表达式exp
(?<!exp)断言自身出现的位置的前面不能匹配表达式exp
[a-z]+(?=exp) 可以匹配到:going,doing ....等中的go,do
九:java中使用正则的相关类位于:java.util.regex包下面
1、Pattern类:正则表达式的编译表示形式。
Pattern p = Pattern.compile(r,int);// 建立正则表达式
2、Matcher类:通过解释Pattern对字符序列执行匹配操作的引擎
Matcher m = p.matcher(str);// 匹配str字符串
Matcher 匹配程序,匹配器
package com.chen.regex;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 测试正则表达式的基本用法
* 常用的方法:
* matches();// 尝试将整个字符序列与模式进行匹配
* m.find();// 该方法是扫描整个字符序列,查找下一个满足要求的子序列,有点像指针
* m.group();// group()等于group(0),输出满足要求的子序列
* replaceAll() 替换操作
* split(regex)进行分割操作
* @author CHJ
*
*/
public class Demo01 {
public static void main(String[] args) {
// test01();
// test02();
// test03();
test04();
}
/**
* 模式匹配查找、输出
*/
public static void test01() {
// 创建正则表达式对象
Pattern p = Pattern.compile("\\d+");// 匹配数字串
// 创建Matcher对象
Matcher m = p.matcher("1As1323**4ds##xcxj3232");
// boolean result = m.matches();// 尝试将整个字符序列与模式进行匹配
// System.out.println(result);
boolean result2 = m.find();// 该方法是扫描整个字符序列,查找下一个满足要求的子序列
System.out.println(result2);
System.out.println(m.group());// group()等于group(0),输出满足要求的子序列
m.find();
System.out.println(m.group());
System.out.println("==================");
while(m.find()) {
System.out.println(m.group());
}
}
/**
* 测试正则表达式的分组处理
*/
public static void test02() {
Pattern p = Pattern.compile("([a-z]+)([0-9]+)");
Matcher m = p.matcher("121dsad#ds121vc**dcs12");
while(m.find()) {
System.out.println(m.group());// group(0)代表的是([a-z]+)([0-9]+)匹配的结果
System.out.println(m.group(1));// group(1)表示([a-z]+)匹配的结果
System.out.println(m.group(2));// group(2)表示([0-9]+)匹配的结果
}
}
/**
* 正则表达式的替换操作
*/
public static void test03() {
Pattern p = Pattern.compile("[0-5]");
Matcher m = p.matcher("192**csds32546js**22474");
String str = m.replaceAll("@");
System.out.println(str);
}
/**
* 测试字符串的分割操作
*/
public static void test04() {
String str = "3213ssf24343cxdf324vcdv3";
String[] arras = str.split("[a-z]+");// 按字符串来分割
System.out.println(Arrays.toString(arras));
}
}
package com.chen.regex;
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;
/**
* 网络爬虫获取网页源码中的超链接URL
* @author CHJ
*
*/
public class WebSpriderToGetUrl {
public static void main(String[] args) {
String srcStr = getResources("http://www.sina.com", "utf8");
// "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js"
String regexStr = "\"http://([\\s\\S]+?)\"";
List<String> list = getURL(srcStr, regexStr);
for (String temp : list) {
System.out.println(temp);
}
}
/**
* 获取网页的源代码字符串
* @param srcURL
* @param charset
* @return
*/
public static String getResources(String srcURL, String charset) {
StringBuilder sb = new StringBuilder();
try {
URL url = new URL(srcURL);
BufferedReader reader = new BufferedReader(new InputStreamReader
(url.openStream(),Charset.forName(charset)));// 转化成指定字符集
String temp = null;
while((temp = reader.readLine()) != null) {
sb.append(temp);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 获得网页中URL并且存入到list链表中
* @param srcStr
* @param regexStr
* @return
*/
public static List<String> getURL(String srcStr, String regexStr) {
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(regexStr);
Matcher m = p.matcher(srcStr);
while(m.find()) {
list.add(m.group(0));
}
return list;
}
}