java深入学习六之正则表达式
来源:互联网 发布:文明5 贸易网络 编辑:程序博客网 时间:2024/06/05 09:26
一、正则表达式(Regular Expression )
1.通常被用来检索、替换那些符合某个模式(规则)的文本。
2.例子:用来验证用户名,密码等表单字段是否符合规则等
二、String中正则表达式
String中有split,replaceFirst,replaceAll,matches 等方法利用正则表达式来对字符串进行操作。其实底层都是通过Pattern类来使用正则表达式。例如:matches
public boolean matches(String regex) { return Pattern.matches(regex, this); }
三、java.util.regex 包,针对正则表达式
1.类Pattern
在java中使用正则表达式,必须首先被编译为此类的实例。jdk文档例子
Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches(); boolean b = Pattern.matches("a*b", "aaaaab");//如果是只匹配aaaaab,这一句可以替代以上三句,上面的p可以多次匹配,还可以匹配其余字符串。
2.正则表达式语法
字符
字符类
预定义字符类
边界匹配器
Greedy(贪婪型) 数量词 尽可能多的匹配
Reluctant(勉强型) 数量词 尽可能少的匹配
Possessive(占有型) 数量词 只在java中才有,更加高级,匹配失败可以回溯
Logical 运算符
特殊构造(命名捕获和非捕获)
非捕获组,在匹配完成后在内存中不保留匹配到的字符
3.Pattern类static final int常量
4.类Matcher
通过解释 Pattern 对 character sequence (String实现这个接口)执行匹配操作的引擎
通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:
matches 方法尝试将整个输入序列与该模式匹配。
lookingAt 尝试将输入序列从头开始与该模式匹配。
find 方法扫描输入序列以查找与该模式匹配的下一个子序列。
每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息。
5.例子
//1.切割 String的split方法实际上是对Pattern的split方法的封装//按照任意两个相同字符就切割,用到了组 String result[]; String testString = "1538766512331212aabcdefg"; String regex = "(.)\\1"; //在java中编写正则表达式\字符要再加个\,但如果是\n\t,可以直接使用 Pattern p = Pattern.compile(regex); System.out.println("编译后的正则表达式:"+p); System.out.println("使用原生Pattern split"); result = p.split(testString); for (String string : result) { System.out.println(string); } System.out.println("使用字符串split"); result = testString.split(regex); for (String string : result) { System.out.println(string); } //输出: //编译后的正则表达式:(.)\1 //使用原生Pattern split //15387 //512 //1212 //bcdefg //使用字符串split //15387 //512 //1212 //bcdefg//2.替换 将手机号的中间四位用*替换 String temp = "13344445555"; temp=temp.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");//使用$取得前面的组号 System.out.println(temp); //输出 //133****5555//3.匹配 String str1 = "13112323435"; String str2 = "19344814529"; System.out.println(str1.matches("1[34578]\\d{9}")); System.out.println(str2.matches("1[34578]\\d{9}")); //输出 //true //false//4.捕获 捕获一段英文中三个字母的单词 String regex = "\\b[a-zA-Z]{3}\\b";//\b是单词边界 String text = "Mr. Johnson had never been up in an aerophane before and he had read a lot about air accidents"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); while(matcher.find()){ System.out.println(matcher.start()+":"+matcher.group()+":"+matcher.end());//start()和end()分别是开始和结束捕获的字符位置 } //输出 //12:had:15 //53:and:56 //60:had:63 //71:lot:74 //81:air:845.综合练习 //给ip地址排序 String ip="192.168.1.1,10.1.6.28,127.0.0.1,8.8.8.8,10.10.10.10"; String regex1 = "(\\d+)"; String regex2 = "0*(\\d{3})"; String [] result= ip.replaceAll(regex1, "00$1").replaceAll(regex2, "$1").split(","); //先在每个数字前加两个0,接着只保留后三位,最后按照,切割成数组 Arrays.sort(result);//数组用字典序排好 for (String string : result) { System.out.println(string); } System.out.println("Ip格式改回原来的"); for (String string : result) { string = string.replaceAll("0{0,2}(\\d)", "$1");//数字前可能出现0-2个0,匹配好,只要后面的数字 System.out.println(string); } //输出 //008.008.008.008 //010.001.006.028 //010.010.010.010 //127.000.000.001 //192.168.001.001 //Ip格式改回原来的 //8.8.8.8 //10.1.6.28 //10.10.10.10 //127.0.0.1 //192.168.1.1//找网页中<p></p>中的内容String text = "<div>"+ "<p>你好 123</p>"+ "<p>你好 456</p>"+ "<p>标签<div></div></p>"+ "</div>";String regex1 = "(?<=<p>).*(?=</p>)";Pattern pattern = Pattern.compile(regex1);Matcher matcher = pattern.matcher(text);while(matcher.find()){ System.out.println(matcher.start()); System.out.println(matcher.group()); System.out.println(matcher.end());}//输出//8//你好 123</p><p>你好 456</p><p>标签<div></div>//48注:我想匹配3个p标签里面的内容,却匹配里第一个<p>和最后一个</p>但是我用Code Architects Regex Tester测试可以分别得到三个p标签内容,暂且记载这,等日后查查资料解决
- java深入学习六之正则表达式
- java学习笔记(六) -- 正则表达式
- java知识点汇总之六正则表达式
- Java正则表达式(六)
- Java--正则表达式(六)
- java之正则表达式学习
- java学习之正则表达式
- Java学习之正则表达式
- Java学习之正则表达式
- Java学习之正则表达式
- Java学习系列(六)Java面向对象之Jar命令、正则表达式、国际化详解
- Java学习系列(六)Java面向对象之Jar命令、正则表达式、国际化详解
- 深入java--正则表达式
- PHP学习之路六(php与正则表达式)
- 轻松学习之Linux教程六 正则表达式详解
- 深入java 使用正则表达式
- 深入java 定义正则表达式
- Java 学习历程二之正则表达式
- 兼容多种浏览器的,多行文本多余显示省略号(···)的方法
- 25. Reverse Nodes in k-Group 还未解决!!!
- 组件间通信 angualr4中间人模式
- 动画速度的控制
- poj3259 luogu2850 虫洞问题
- java深入学习六之正则表达式
- Python 中的random函数
- Apache Beam的分窗与触发器
- Windows系统中搭建Spark开发环境
- Qt实现一个简单的打字游戏
- LeetCode 382. Linked List Random Node
- html和CSS基础学习(六)
- input框placeholder样式修改
- 2017 ACM-ICPC乌鲁木齐网络赛 G. Query on a string 【KMP+树状数组】