一、边界符
正则表达式中的边界符(位置符)用来提示字符所处的位置;
^:表示匹配行首的字符(表示以某字符开始的文本 )
$: 表示匹配末尾的字符(表示以某字符结束的文本)
【如果 ^ 和$ 在一起,表示必须是精确匹配】
//以‘p’开始的字符串
System.out.println("pro-file".matches("^p.*"));
//以‘e’结束的字符串
System.out.println("pro-file".matches(".*e$"));
//以‘p’开始 ‘e’结束的字符串
System.out.println("pro-file".matches("^p.*e$"));
二、字符类
默认匹配一个字符
[-]:匹配的字符范围,所有可供选择的都放在方括号内,例如:
[abc]: 只能是a,b,或c
[^abc]: 除了a,b,c之外的任何字符
[a-zA-Z]: a到Z A到Z,包括 (范围)
[a-d[m-p]]: a到d,或m到p: ([a-dm-p]并集)
[a-z&&[def]]: d,e,或f(取交集)
[a-z&&[^bc]]: a-z,除了b和c
[a-z&&[^m-p]: a-z,除了m-p
【注意和边界符 ^ 区别,边界符写到方括号外面】
// 只能是 a b c
System.out.println("a".matches("[abc]")); //true
System.out.println("z".matches("[abc]")); //false
// 不能出现a b c
System.out.println("a".matches("[^abc]")); //false
System.out.println("z".matches("[^abc]")); //true
三、预定义字符类
默认匹配一个字符
. 通配符,任意字符
\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_]等效
System.out.println("a".matches("\\d")); //false
System.out.println("3".matches("\\d")); //true
System.out.println("333".matches("\\d"));//false
System.out.println("z".matches("\\w"));//true
System.out.println("2".matches("\\w"));//true
System.out.println("21".matches("\\w"));//false
System.out.println("你".matches("\\w"));//false
System.out.println("你".matches("\\W"));//true
四、量词
配合匹配多个字符
X? X,零次或一次匹配
X* X,零次或多次匹配
X+ X,一次或多次
X{n} X,正好n次
X{n, } X,至少n次
X{n,m} X,至少n次但是不超过m次
// 必须是数字 字母 下划线 至少 6位
System.out.println("2442fsfsf".matches("\\w{6,}"));//true
System.out.println("244f".matches("\\w{6,}"));//false
// 验证码 必须是数字和字符 必须是4位
System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));//true
System.out.println("23_F".matches("[a-zA-Z0-9]{4}"));//false
System.out.println("23dF".matches("[\\w&&[^_]]{4}"));//true
System.out.println("23_F".matches("[\\w&&[^_]]{4}"));//false
五、利用正则表达式,爬取信息
步骤:
① 定义正则表达式,字符串形式
② 生成Pattern匹配对象,正则表达式的编译表示形式。若要使用正则表达式必须将其【编译到此类】的实例中
③ 生成Matcher内容匹配器对象,Matcher 也没有公共构造方法。需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象进行生成
//爬取出 电话号码和邮箱。
String rs = "电话020-43422424,微信:" +
"damiao@java.cn,电话18762832633,0203232323" +
"邮箱damiao@java.cn,400-100-3233 ,4001003232";
// 1、定义爬取规则,字符串形式
String regex = "(0\\d{2,6}-?\\d{5,20})|(1[3-9]\\d{9})|(400-?\\d{3,9}-?\\d{3,9})| (\\w{1,30}@([\\w&&[^_]])+(\\.([\\w&&[^_]]{2,10})){1,2})";
// 2、把这个爬取规则编译成匹配对象。
Pattern pattern = Pattern.compile(regex);
// 3、得到一个内容匹配器对象
Matcher matcher = pattern.matcher(rs);
// 4、开始找了
while (matcher.find()) {
System.out.println(matcher.group());
}