正则表达式02

5.4正则表达式语法02

5.4.6捕获分组

详见5.3.3

例子

package li.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern; //演示分组
public class RegExp07 {
public static void main(String[] args) {
String content = "hanshunping s7789 nn1189han"; //下面就是非命名分组
//说明
// matcher.group(0) 是不加括号匹配到的字符串
// matcher.group(1) 是不加括号匹配到的字符串的第一个分组的内容
// matcher.group(2) 是不加括号匹配到的字符串的第二个分组的内容
//String regStr = "(\\d\\d)(\\d\\d)";//匹配4个数字的字符串 //命名分组:即可以给分组取名(名称随意)
String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";//匹配4个数字的字符串 Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content); while (matcher.find()) {
System.out.println("找到:" + matcher.group(0));
System.out.println("第一个分组的内容:" + matcher.group(1));
System.out.println("第一个分组的内容[通过组名]:" + matcher.group("g1"));
System.out.println("第二个分组的内容:" + matcher.group(2));
System.out.println("第二个分组的内容[通过组名]:" + matcher.group("g2"));
}
}
}

5.4.7非捕获分组

例子

给定一个字符串String content ="hello韩顺平教育 jack韩顺平老师 韩顺平同学hello";

使用非捕获分组完成,有如下要求:

  1. 找到韩顺平教育、韩顺平老师、韩顺平同学 子字符串
  2. 找到韩顺平 这个关键字,但是要求只是查找韩顺平教育韩顺平老师中包含的韩顺平
  3. 找到韩顺平这个关键字,但是要求只是查找不是(韩顺平教育和韩顺平老师)中包含有的韩顺平
package li.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern; public class RegExp08 {
public static void main(String[] args) {
String content = "hello韩顺平教育 jack韩顺平老师 韩顺平同学hello"; // 1. 找到 韩顺平教育、韩顺平老师、韩顺平同学 子字符串
//String regStr = "韩顺平教育|韩顺平老师|韩顺平同学";
//上面的写法可以等价于非捕获分组,注意:不能matcher.group(1)
//String regStr = "韩顺平(?:教育|老师|同学)"; // 2. 找到 韩顺平 这个关键字,但是要求只是查找 韩顺平教育 和 韩顺平老师 中包含的韩顺平
//下面也是非捕获分组,也不能matcher.group(1)
//String regStr = "韩顺平(?=教育|老师)"; // 3. 找到 韩顺平 这个关键字,但是要求只是查找不是(韩顺平教育和韩顺平老师)中包含有的韩顺平
//下面也是非捕获分组,也不能matcher.group(1)
String regStr = "韩顺平(?!教育|老师)"; Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content); while (matcher.find()) {
System.out.println("找到:" + matcher.group(0));
}
}
}

5.4.8非贪婪匹配

字符 说明
? 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o"。

例子

package li.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern; public class RegExp09 {
public static void main(String[] args) {
String content = "hello111111 ok"; //String regStr = "\\d+";//默认是贪婪匹配
String regStr = "\\d+?";//非贪婪匹配 Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content); while (matcher.find()) {
System.out.println("找到:" + matcher.group(0));
}
}
}

5.5正则应用实例

  • 对字符串进行如下验证
  1. 汉字

  2. 邮政编码

    要求:是1-9开头的一个六位数,比如:123890

  3. QQ号码:

    要求:是一个1-9开头的一个(5位数-10位数),比如:12389,1345687,187698765

  4. 手机号码

    要求:必须以13,14,15,18开头的11位数,比如:13588889999

  5. URL:https://www.bilibili.com/video/BV1fh411y7R8?p=893&spm_id_from=pageDriver&vd_source=7e137c3a1559f85aacb1f151bb0a830d

例子1:

package li.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern; //正则表达式的应用实例
public class RegExp10 {
public static void main(String[] args) {
String content = "1358888999";
//1. 汉字
//String regStr="^[\u4e00-\u9fa5]+$";//^和 $同时出现时,表示只能匹配 ^和 $之间的内容 //2. 邮政编码
//要求:是1-9开头的一个六位数,比如:123890
//String regStr="^[1-9]\\d{5}$"; //3. QQ号码:
//要求:是一个1-9开头的一个(5位数-10位数),比如:12389,1345687,187698765
//String regStr = "^[1-9]\\d{4,9}$"; //4. 手机号码
//要求:必须以13,14,15,18开头的11位数,比如:13588889999
String regStr = "^1[3458]\\d{9}$"; Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
System.out.println("满足格式");
} else {
System.out.println("不满足格式");
}
}
}

例子2:

package li.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern; public class RegExp11 {
public static void main(String[] args) {
String content = "https://www.bilibili.com/video/BV1fh411y7R8?p=894&spm_id_from=pageDriver&vd_source=7e137c3a1559f85aacb1f151bb0a830d";
String content2 = "https://10fastfingers.com/typing-test/simplified-chinese";
String content3 = "https://zh.ua1lib.org/"; /**
* 思路:
* 1.先确定URL的开始部分 https:// 或 http://
* ((https|http)://)
* 2.接着是域名部分 www.bilibili.com
* www. 和 bilibili. 可以写成 ([\\w-]+\\.)+
* [\\w-]+ 则匹配 com
* 3.接着是域名后面
* 3.1首先是整体
* ()?表示()里面的出现零次或者一次
* 3.2然后是小括号里面
* \\/ 表示匹配 / 号
* [ ]* 表示匹配中括号里面的 0-n次
* 3.3中括号里面
* \w-?=&/:.# 表示匹配 `数字` 或 `大小写字母` 或 `下划线` 或 `-` 或 `?` 或 `=` 或 `&` 或 `/` 或 `:` 或 `.` 或 `#`
*/
String regStr="^((https|http)://)([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/:.#]*)?$";//注意:中括号里面的字符都是它本省的含义,不用转义
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content3);
if (matcher.find()) {
System.out.println("满足格式");
} else {
System.out.println("不满足格式");
}
}
}

注意:中括号里面的字符都是它本省的含义,不用转义

最新文章

  1. 我常用的那些linux命令
  2. 设置参数进行启动的Python脚本模板
  3. indows 8上强制Visual Studio以管理员身份运行
  4. PHP 表单提交多行数据,显示多个submit
  5. 在Linux中使用VS Code编译调试C++项目
  6. NSRange,判断字符串的各种操作~
  7. 如何让低版本的IE浏览器(IE6/IE7/IE8)支持HTML5 header等新标签
  8. flash文件运动节奏的控制
  9. 导出页面文档(只在IE8下测试过)
  10. android中 MediaStore提取缩略图和原始图像
  11. 【Flume NG用户指南】(1)设置
  12. Linux(6)文件和磁盘管理
  13. uiautomatorviewer报错“Error taking device screenshot: EOF” ,
  14. 如何恢复Eclipse中被误删除的文件
  15. eclipse中一些常见svn图标的含义
  16. SQL SERVER镜像配置(包含见证服务器)
  17. 有关于malloc申请内存和free内存释放
  18. 【转】MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
  19. struct的使用
  20. Delphi for iOS开发指南(7):在iOS应用程序中使用WebBrowser组件

热门文章

  1. MultiSpehere类定义
  2. Python-基础学习-第二轮
  3. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(11)-Fiddler设置安卓手机抓包,不会可是万万不行的!
  4. PerfView专题 (第八篇):洞察 C# 内存泄漏之寻找静态变量名和GC模式
  5. R型医用变压器为什么越来越受大众喜爱?
  6. Java 在PDF中添加水印
  7. 一次较波折的MySQL调优
  8. KingbaseES通过sys_waldump解析wal日志
  9. KingbaseES OUT 类型参数过程与函数的调用方法
  10. 如何写成高性能的代码(一):巧用Canvas绘制电子表格