1.使用括号可以提取字符串

不加括号匹配电话号码



匹配成功后,如何提取想要的字符串?

使用(...)可以分组:"^(\d{3,4})\-(\d{6,8})$"



2.String.matcher vs Pattern.matcher

前面用到的正则表达式是使用String.matches(),而我们在分组时用到的是java.util.regex.Matcher和java.util.regex.Pattern。而String.matches()内部就是调用的Matcher和Pattern类的方法。

反复使用一个正则表达式字符串进行快速匹配效率较低:

  • 正则表达式虽然是一个字符串,但首先要编译为Pattern对象 ,然后再进行匹配。因此可以先创建Pattern对象,然后反复使用
    public static void main(String[] args){
//使用String.matches匹配
String regex = "^\\d{3,4}\\-\\d{6,8}";
System.out.println("使用String.matches进行匹配:"+"010-123456789".matches(regex));
//使用Pattern类定义正则表达式
Pattern pattern = Pattern.compile("^(\\d{3,4})\\-(\\d{6,8})$");
//使用Pattern的matches匹配
System.out.println("使用Pattern.matches进行匹配:"+pattern.matcher("010-12345678").matches());
//获取matcher对象,在获取匹配结果
Matcher matcher = pattern.matcher("010-12345678");
System.out.println("转换为Matcher对象进行匹配:"+matcher.matches()); }

3.使用Matcher.group(n)可以快速提取字串

    public static void main(String[] args) throws IllegalAccessException {
Pattern pattern = Pattern.compile("^(\\d{3,4})\\-(\\d{6,8})$");
//获取matcher对象
Matcher matcher = pattern.matcher("010-1234567");
//必须匹配成功,才能提取子串,即matcher.matches()不能省略,否则会报java.lang.IllegalStateException,
try{
System.out.println(matcher.group(0));
}catch (Exception e){
System.out.println(e.getClass()+": "+e.getMessage());
}
//因此可以改写为
if (matcher.matches()) {
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
}
}


## 4.示例
Tel.java
```#java
package com.testList;

import java.util.Objects;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Tel {

//Pattern对象是可以反复使用的

static Pattern p = Pattern.compile("^(0\d{2,3})\-([1-9]\d{5,7})$");

public static Tel parse(String s){//返回类型为Tel,同public boolean 方法名(){}

Matcher m = p.matcher(s);

if(m.matches()){

String s1 = m.group(1);

String s2 = m.group(2);

return new Tel(s1,s2);

}

return null;

}

private final String areaCode;

private final String phone;

public Tel(String areaCode, String phone){

this.areaCode = areaCode;

this.phone = phone;

}

public String getAreaCode(){

return areaCode;

}

public String getPhone(){

return phone;

}

@Override

public boolean equals(Object o){

if(o==this){

return true;

}

if( o instanceof Tel){

Tel t = (Tel) o;

return Objects.equals(t.areaCode,this.areaCode) && Objects.equals(t.phone,this.phone);

}

return false;

}

@Override

public int hashCode(){

return Objects.hash(this.areaCode,this.phone);

}

@Override

public String toString(){

return this.areaCode + "-" + this.phone;

}

}

TelTest.java
```#java
package com.testList; import org.junit.Test; import static org.junit.Assert.*; public class TelTest { @Test
public void testIsVaildTes() {
assertEquals(new Tel("010","123456"),Tel.parse("010-123456"));
assertEquals(new Tel("010","12345678"),Tel.parse("010-12345678")); assertNull(Tel.parse("123-12345678"));
assertNull(Tel.parse("010-0123456"));
assertNull(Tel.parse("010#12345678"));
}
}

5.总结:

正则表达式分组可以通过Matcher对象快速提取字串:

  • group(0)表示匹配的整个字符串
  • group(1)表示第1个子串
  • group(2)表示第2个子串
  • ...

廖雪峰Java9正则表达式-2正则表达式进阶-3分组匹配的更多相关文章

  1. 廖雪峰Java9正则表达式-2正则表达式进阶-6搜索和替换

    1.使用正则表达式分割字符串: String[] string.split(String regex); "a b c".split("\\s");->[ ...

  2. 廖雪峰Java9正则表达式-2正则表达式进阶-5非贪婪匹配

    1.贪婪匹配 问题:给定一个字符串表示的数字,判断该数字末尾0的个数? "123000": 3个0 "10100": 2个0 "1001": ...

  3. 廖雪峰Java9正则表达式-1正则表达式入门-2正则表达式匹配规则

    正则表达式的匹配规则: 从左到右按规则匹配 匹配规则及示例 可以匹配 不能匹配 "abc" "abc" 不能匹配:"ab", "A ...

  4. 廖雪峰Java9正则表达式-1正则表达式入门-1正则表达式简介

    1.使用代码来判断字符串 场景: 判断字符串是否是有效的电话号码:"010-12345678", "123ABC456" 判断字符串是否是有效的电子邮箱地址:& ...

  5. 廖雪峰Python电子书总结

    函数 1.注意:函数的默认参数必须指向不可变对象 未修改前: def add_end(L=[]): L.append('END') return L 存在的问题:如果连续调用多次,会出现多个 'END ...

  6. 学习php中的正则表达式,PHP正则表达式基础

    语法格式:位于定界符"/"之间. 较为常用的元字符包括: “+”, “*”,以及 “?”. 其中, “+”元字符规定其前导字符必须在目标对象中连续出现一次或多次, “*”元字符规定 ...

  7. 廖雪峰python教程的第一个疑问

    函数的参数一节中提到: def add_end(L = []); L.append('END') return L 正常调用add_end时(也就是有参数传入时): >>> add_ ...

  8. 爬虫:把廖雪峰的教程转换成 PDF 电子书

    写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...

  9. Python自学笔记-生成器(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 生成器 通过列 ...

随机推荐

  1. 【5】用vector进行直接插入排序

    百分百自己编的程序,越来越觉得编程很好玩了. 但这算是第一次自己用vector这种不是那么无脑的方法编程,只能最多对3个数进行排序wwwww 今天我要回去搬宿舍了,等明天有时间,我一定要把bug找到! ...

  2. Windows 7 改造

    1.界面改造 1.1 软件 Wallpaper Engine 收费(18¥) 动态桌面,通过steam安装,使用steam中的创意工坊下载内容 最好使用集成显卡运行,单显卡方案容易桌面异常刷新 Clo ...

  3. 学习HTML+JSP(更新中)

    1.HTML文档=网页 2.html是超文本标记语言的的缩写 超文本:超越普通文本,可以在文档中添加普通文本不能添加的元素,如:图片.视频.超链接等 标记语言:本身没有逻辑能力和执行能力,只被读取 脚 ...

  4. CSS常用属性-xy

    一.文本Text CSS text-align 属性 文本对齐方式 CSS text-decoration 属性 text-decoration 属性规定添加到文本的修饰 CSS line-heigh ...

  5. epoll+socket实现 socket并发 linux服务器

    /* 实现功能:通过epoll, 处理多个socket * 监听一个端口,监听到有链接时,添加到epoll_event * xs */ #include <stdio.h> #includ ...

  6. vue 用户停留页面超过30分钟未操作 强制退出到登录页面

    先说下主要实现思路,通过给你的根节点绑定mouseover事件,首先声明下当前时间,每次滑过时记录下滑过的时间,两个时间转化成毫秒数,进行对比,如果超过30分钟,则清除token,跳转到login.h ...

  7. Python--错误SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

    Refer to:https://www.cnblogs.com/cyiner/archive/2011/09/18/2180729.html 用Python打开文件: fo=open("C ...

  8. scott 本月报将收录移动Web加速技术的主要进展,欢迎读者一起完善,投稿邮箱:openweb@baidu.com

    _trackPageview 功能说明 用于发送某个URL的PV统计请求,适用于统计AJAX.异步加载页面,友情链接,下载链接的流量. 代码语法 _czc.push(["_trackPage ...

  9. nodejs连接阿里云物联网套件(mqtt)

    文档地址:https://help.aliyun.com/document_detail/73742.html   连接方法:先HTTPS认证再连接 /* *阿里云物联网套件nodejs连接示例 *C ...

  10. 关于rabbitmq的介绍

    原文转载:http://blog.csdn.net/whycold/article/details/41119807 保护原帖,尊重技术,致敬工匠! 一.简介 MQ全称为Message Queue, ...