正则表达式
说真的正则表达式真不好写,当我收集资料准备开始写的时候,发现收集的东西越来越多范围也越来越广,我文章的前提就是文章要清晰,
在缕清自己思路之后,我从先简后难的方式来写有关正表达式,你们如果觉得这篇写的还可以的话,可以先关注我,接下来我会陆续更新。
一. 什么是正则表达式
正则表达式(regular expressions)是一种描述字符串集的方法,它是以字符串集中各字符串的共有特征为依据的。
正则表达式可以用于搜索、编辑或者是操作文本和数据。这是官方表达听的有点绕口,用通俗的话来说就是:正则表达式主要用来处理和文本有关的内容
常见的处理方式有四种:1. 匹配 2. 切割 3. 替换 4. 获取 在下面我也会一一举例说明。
二. 正则表达式常见的符号含义
这个我在正则表达式(1)中,有关常用的也大概做个介绍,大家可以往前翻阅。
三. 常见的处理方式有四种
(1)匹配 我这里使用的是字符串对象的方法 match(String regex),
- 1 import java.util.regex. * ;
- 2 public class TestException {
- 3 public static void main(String[] args) throws Exception {
- 4 String tel = "18600000111";
- 5 String reg = "1[3578]\\d{9}"; //首字母1,第二字母3,5,7,8,后面都是数字共有9位
- 6 boolean b1 = tel.matches(reg);
- 7 System.out.println(b1); //输出结果true
- 8
- }
- 9
- }
(2)切割 我这里使用的是字符串中的 split 方法
案例一:切割一个或多个空格
- 1 //切割一个或者多个空格
- 2 import java.util.regex. * ;
- 3 public class TestException {
- 4 public static void main(String[] args) throws Exception {
- 5 String str = "aaa bbb ccc ddd eee";
- 6 String[] arr = str.split(" +"); //" +"表示至少有一个空格
- 7
- for (String s: arr) {
- 8 System.out.print(s);
- 9
- }
- 10
- }
- 11
- }
运行结果;
- aaabbbcccdddeee
案例二:通过. 来切割字符串
- 1 //通过.来切割字符串
- 2 import java.util.regex. * ;
- 3 public class TestException {
- 4 public static void main(String[] args) {
- 5 String str2 = "zhangsan.lisi.wangwu";
- 6
- /* \\是代表转义字符,如果你直接放split("."),是无法切割的,因为.在正则表达式中.有它特有的含义
- 7 当你用转义之后\\.那么它就只代表一个点,而不具有特殊意义*/
- 8 String[] arr2 = str2.split("\\.");
- 9
- for (String s: arr2) {
- 10 System.out.println(s);
- 11
- }
- 12
- }
- 13
- }
- 14
- /* 补充:在java中需要转义的除了.外,还有需要先转义不能直接切割的:
- 15 * $ ( ) * + [ ] ? \ ^ { } |
- 16 * 这么几个大家用它来切割的时候,转义后就可以了
- 17 */
运行结果:
- zhangsan
- lisi
- wangwu
案例三:用重复项来切割
- 1 //用重复项来切割
- 2 import java.util.regex. * ;
- 3 public class TestException {
- 4 public static void main(String[] args) {
- 5 String str3 = "wer#######tayuio****asdfg";
- 6 String reg = "(..)"; //(.)代表第一个任意字符 \\1代表回去第一组数据 +代表1个或者多个
- 7 String[] arr3 = str3.split(reg);
- 8
- for (String s: arr3) {
- 9 System.out.println(s);
- 10
- }
- 11
- }
- 12
- }
- 13
- /* 补充:我怕初学者对"(.)\\1+",还没有搞懂,我这里在单独解释一下:(.)的字符视为一个整体。 \\1代表回去第一组数据
- 14 * 那它其实在这里也就代表(.),所以就相当于(.)(.)+,这里仅仅是相当于,也是为了好理解,其实他们还是有本质区别的
- 15 * 因为(.)==\\1,就是说如果.代表a,那么\\1也就代表a,而(.)≠(.),前面代表a后面可以代表b,因为前后两个点不是同一个点
- 16 * 我也不知道这样比较是否恰当, 反正意思就是这个意思
- 17 */
运行结果:
- wer
- tayuio
- asdfg
(3)替换 使用 String 字符串汇总的方法
案例一:把重复的数据 替换为#
- 1 //把重复的数据 替换为#
- 2 import java.util.regex. * ;
- 3 public class TestException {
- 4 public static void main(String[] args) {
- 5 String str = "wer#####yw****fghj";
- 6 //把重复的数据 替换为#
- 7 str = str.replaceAll("(.)\\1+", "#"); //(.) 第一个任意字符 \\1 取第一组数据 + 1个或者多个
- 8 System.out.println(str);
- 9
- }
- 10
- }
运行结果:
- wer#yw#fghj
案列二:把重复项都变成单个
- 1 import java.util.regex. * ;
- 2 public class TestException {
- 3 public static void main(String[] args) {
- 4 String str = "wer#####yw****fg???hj";
- 5 //后一个参数的含义 可以通过$ 数字引用第一个参数中的组,这个美元符号代表就是前面小括号里的内容
- 6 str = str.replaceAll("(.)\\1+", "$1");
- 7 System.out.println(str);
- 8
- }
- 9
- }
运行结果:
- wer#yw*fg?hj
案例三:电话号码中间几位用 * 表示
- 1 import java.util.regex. * ;
- 2 public class TestException {
- 3 public static void main(String[] args) {
- 4 String str2 = "15889895644"; //158****5644
- 5 str2 = str2.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
- 6 System.out.println(str2); // $1表示符号前面第一个小括号,$2代表第二个,如果有第三个小括号,那也可以$3;
- 7
- }
- 8
- }
运行结果:
- 158****5644
(4)获取 字符串中没有直接提供该功能 只能通过正则表达匹配
案例一:获取正则表达式所匹配的字符串
- 1 import java.util.regex. * ;
- 2 public class TestException {
- 3 public static void main(String[] args) {
- 4 String str = "da jio zhu yi laa, ming tian fang jia laa";
- 5 //1.定义规则
- 6 String reg = "\\b[a-z]{3}\\b"; //任意三个字符 \\b 是单词的边界(明白为什么加这个)
- 7 Pattern p = Pattern.compile(reg);
- 8 //3.通过正则表达对象 获取匹配器对象 并把操作的字符串关联
- 9 Matcher m = p.matcher(str);
- 10
- while (m.find()) { //find()用来搜索与正则表达式相匹配的任何目标字符串
- 11 System.out.println(m.start() + "....." + m.group() + "..." + m.end());
- 12
- } //start()开始位置 group()用来返回包含了所匹配文本的字符串 end()结束位置
- 13
- }
- 14
- }
- 15
- /* 有关:在regex(正则表达式)包中,包括了两个类,Pattern(模式类)和Matcher(匹配器类)。
- 16 * 这个大家也可以多去了解
- 17 */
运行结果:
- 3.....jio...6
- 7.....zhu...10
- 14.....laa...17
- 35.....jia...38
- 39.....laa...42
四:最后来一个综合小案例
题目 1:10.10.10.10 192.168.118.40 192.168.1.200 127.0.0.108 按照升序排序
- 1 import java.util.Arrays;
- 2 import java.util.regex. * ;
- 3 public class TestException {
- 4 public static void main(String[] args) {
- 5 String ip = "10.10.10.10 192.168.118.40 192.168.1.200 127.0.0.108";
- 6
- /*
- 7 * 为了方便 每一个端都补零 保证每一个字段至少是三位
- 8 */
- 9 ip = ip.replaceAll("(\\d+)", "00$1"); //补0,让至少有三位数
- 10 11 ip = ip.replaceAll("0*(\\d{3})", "$1"); //所有都变成三位数
- 12 13 String[] ips = ip.split(" +"); //用空格来切割
- 14 Arrays.sort(ips); //升序排序
- 15
- for (String x: ips) {
- 16 System.out.println(x.replaceAll("0*(\\d+)", "$1")); //还原
- 17
- }
- 18
- }
- 19
- }
- 20
- /** 这个题目或许看着不难,难就难在思维模式,它这每一步都很关键,也是希望大家在学习的途中多思考,而不是停留在看的基础上
- 21 */
运行结果:
- 10.10.10.10
- 127.0.0.108
- 192.168.1.200
- 192.168.118.40
这篇文章到这里结束了,接下来对于正则表达式我还会再写,比如 Pattern(模式类) 和 Matcher(匹配器类),再比如如何获取文本中的电话号码等等深入的一些东西,不过最近应该不写了,
接下来我会写一些其它有关的知识。
大家看完也欢迎做出点评,哪里写的不周到或者还可以更好的也欢迎提出,我会立即更正, 谢谢!
来源: