JAVA之正则表达式
一、简介
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
简单来说:它是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。
二、正则表达式的构造摘要
字符类
[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:[ad-z](减去) [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去) //[]代表单个字符
讯享网
预定义字符类
// \代表转义字符,如果想表示\d的话,需要\\d
. 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w]
Greddy 数量词
X? X,一次或一次也没有 X* X,零次或多次 X+ X,一次或多次 X{ n} X,恰好 n 次 X{ n,} X,至少 n 次 X{ n,m} X,至少 n 次,但是不超过 m 次
三、简单应用(号码验证)
讯享网1:要求必须是5-15位数字 2:0不能开头 3:必须都是数字
String regex = "[1-9]\\d{4,14}"; System.out.println("".matches(regex)); //true System.out.println("012345".matches(regex)); //false System.out.println("abc".matches(regex)); //false
四、正则表达式的分割功能
String[]split(String regex)
根据给定正则表达式的匹配拆分此字符串。
讯享网String s = "123.234.345"; String[] arr = s.split("\\."); //通过正则表达式切割字符串 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } /* *123 *234 *345 */
五、正则表达式的替换功能
StringreplaceAll(String regex, String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String s = "wo111xi222huan3java"; String regex = "\\d"; //\\d代表的是任意数字 String s2 = s.replaceAll(regex, ""); System.out.println(s2); //woxihuanjava
六、正则表达式的分组功能
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C) 组零始终代表整个表达式。
案例1:
讯享网 //叠词 快快乐乐,高高兴兴 String regex = "(.)\\1(.)\\2";//\\1代表第一组又出现一次 \\2代表第二组又出现一次 System.out.println("快快乐乐".matches(regex));//true System.out.println("快乐乐乐".matches(regex));//flase System.out.println("高高兴兴".matches(regex));//true System.out.println("死啦死啦".matches(regex));//flase //叠词 死啦死啦,高兴高兴 String regex2 = "(..)\\1"; System.out.println("死啦死啦".matches(regex2));//true System.out.println("高兴高兴".matches(regex2));//true System.out.println("快快乐乐".matches(regex2));//flase
案例2:
//需求:请按照叠词切割: "sdfgkkkhjppppkl"; String s = "sdfgkkkhjppppkl"; String regex = "(.)\\1+"; //+代表第一组出现一次到多次 String[] arr = s.split(regex); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } /* *sd *fg *hj *kl */
案例3:
讯享网 /* * 需求:我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程 将字符串还原成:“我要学编程”。 */ String s = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程"; String s2 = s.replaceAll("\\.+", ""); String s3 = s2.replaceAll("(.)\\1+", "$1"); //$1代表第一组中的内容 System.out.println(s3); //我要学编程
七、Pattern和Matcher
1.概述
Pattern类:
正则表达式的编译表示形式。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
Matcher类:
通过解释 Pattern 对字符序列执行匹配操作的引擎。
通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:
matches方法尝试将整个输入序列与该模式匹配。lookingAt尝试将输入序列从头开始与该模式匹配。find方法扫描输入序列以查找与该模式匹配的下一个子序列。
每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息。
2.调用顺序
典型的调用顺序:
Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();
仅使用一次正则表达式:
讯享网boolean b = Pattern.matches("a*b", "aaaaab");
3.方法
booleanmatches()
尝试将整个区域与模式匹配。
booleanlookingAt()
尝试将从区域开头开始的输入序列与该模式匹配。
booleanfind()
尝试查找与该模式匹配的输入序列的下一个子序列。booleanfind(int start)
重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
Stringgroup()
返回由以前匹配操作所匹配的输入子序列。Stringgroup(int group)
返回在以前匹配操作期间由给定组捕获的输入子序列。
4.案例
案例1:
Pattern p = Pattern.compile("a*b"); //获取到正则表达式 Matcher m = p.matcher("aaaaab"); //获取匹配器 boolean b = m.matches(); //看是否能匹配,匹配就返回true System.out.println(b); //true System.out.println("aaaaab".matches("a*b")); //与上面的结果一样
案例2:
讯享网//需求:把一个字符串中的手机号码获取出来 String s = "我的手机是,我曾用过,还用过"; String regex = "1[3578]\\d{9}"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(s); while(m.find()) System.out.println(m.group()); /* * * * /

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/48063.html