首页 > 编程语言 >java-正则表达式

java-正则表达式

时间:2022-12-01 20:02:12浏览次数:41  
标签:匹配 正则表达式 Pattern end System println java out


1.一般流程

Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();

boolean b = Pattern.matches("a*b", "aaaaab");
boolean b = "aaaaab".matches("a*b");

第一种,当需要匹配多个字符串时,效率高。

2.几个重要的元字符(metacharacter)

.代表一个字符
*代表0或多个
+代表1或多个
?代表0或1个
\d 一个数字
\s A whitespace character: [ \t\n\x0B\f\r]
\w A word character: [a-zA-Z_0-9]

注意:java中匹配一个\主要四个“\\”

System.out.println("\\".matches("\\\\"));

输出true

3.范围

[abc] 表示匹配a或b或c中的一个
[^abc] 表示任意一个字符除了a或b或c
无论[]内多复杂,它只匹配一个字符

4.边界匹配

^ The beginning of a line
$ The end of a line
\b A word boundary

注意^位于[]内部是取反,否则是便是一行的开始。

System.out.println("hello sir".matches("^h[a-z]{1,4}\\b.*"));

输出true

5.Matcher类的几个函数

find():每次匹配还没剩下的子串
lookingAt():每次从头开始匹配
start():匹配的开始位置,end()匹配的结束的下一个位置。左闭右开空间

Pattern p = Pattern.compile("\\d{3,5}");
Matcher m = p.matcher("123-5435656-234-00");

while(m.find()){
System.out.println(m.start()+":"+m.end());
}

0:3
4:9
12:15

6.字符串匹配替换

public static void main(String[] args) {
Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("java Java JAVA ilovejava end");

//全部转换成JAVA
// System.out.println(m.replaceAll("JAVA"));
//JAVA JAVA JAVA iloveJAVA end

StringBuffer sb=new StringBuffer();
int i=0;
while(m.find()){
if(i%2==0){
m.appendReplacement(sb, "java");
}else{
m.appendReplacement(sb, "JAVA");
}
i++;
}
//不加这句,后面的end就没有
m.appendTail(sb);

System.out.println(sb);
//java JAVA java iloveJAVA end
}

7.分组

注意整个字符是第0组。

public static void main(String[] args) {
Pattern p = Pattern.compile("(\\d{3,5})([a-z]{2})");
Matcher m = p.matcher("123aa-13242bb-456cc-00");

//只输出匹配到的字母部分
while(m.find()){
System.out.println(m.group(2));
}

}

输出
aa
bb
cc

8.quantifiers

有三种quantifiers,分别是Greedy,Reluctant(勉强),Possessive (侵占)
在贪婪、勉强和侵占三个量词间有着细微的不同。
  贪婪(*, ?, +):读入整个串,从后往前匹配
  勉强(*?, ??, +?):从前往后匹配
  侵占(*+, ?+, ++):读入整个串,从前往后匹配,匹配的是整个串
  贪婪量词之所以称之为“贪婪的”,这是由于它们强迫匹配器读入(或者称之为吃掉)整个输入的字符串,来优先尝试第一次匹配,如果第一次尝试匹配(对于整个输入的字符串)失败,匹配器会通过回退整个字符串的一个字符再一次进行尝试,不断地进行处理直到找到一个匹配,或者左边没有更多的字符来用于回退了。赖于在表达式中使用的量词,最终它将尝试地靠着 1 或 0 个字符的匹配。
  但是,勉强量词采用相反的途径:从输入字符串的开始处开始,因此每次勉强地吞噬一个字符来寻找匹配,最终它们会尝试整个输入的字符串。
  最后,侵占量词始终是吞掉整个输入的字符串,尝试着一次(仅有一次)匹配。不像贪婪量词那样,侵占量词绝不会回退,即使这样做是允许全部的匹配成功。

public static void main(String[] args) {
//Greedy
Pattern p = Pattern.compile(".{3,10}[0-9]");
Matcher m = p.matcher("aaaa4bbbb6");
if(m.find()){
System.out.println(m.start()+":"+m.end());
}else{
System.out.println("not match");
}
}

输出0:10

public static void main(String[] args) {
//Reluctant
Pattern p = Pattern.compile(".{3,10}?[0-9]");
Matcher m = p.matcher("aaaa4bbbb6");
if(m.find()){
System.out.println(m.start()+":"+m.end());
}else{
System.out.println("not match");
}
}

输出0:5

public static void main(String[] args) {
//Possessive
Pattern p = Pattern.compile(".{3,10}+[0-9]");
Matcher m = p.matcher("aaaa4bbbb6");
if(m.find()){
System.out.println(m.start()+":"+m.end());
}else{
System.out.println("not match");
}
}

输出not match
Possessive 型匹配失败是因为整个字符串已经被”.{3,10}+”匹配完成了,后面的”[0-9]”没有东西匹配,所以匹配失败。


标签:匹配,正则表达式,Pattern,end,System,println,java,out
From: https://blog.51cto.com/u_15899184/5904070

相关文章

  • Java 集合框架4:Set
    目录Set1.概述2.SortedSet3.实现HashSetEnumSetCopyOnWriteArraySetBitSetSet1.概述Set是一个不允许包含重复元素,或者说是不允许包含包含满足e1.equals(e2)的两个元素......
  • JavaScript Everywhere All In One
    JavaScriptEverywhereAllInOnetagsjsNode.jsExpress.jsMongoDBApolloClientGraphQLAPIJWTOAuth2.0ReactReactNativeElectronhttps://github.com/......
  • AlmaLinux 9.1中安装java11
     001、系统[[email protected]]#cat/etc/redhat-releaseAlmaLinuxrelease9.1(LimeLynx)  002、测试java命令[root@PC1test]#javabash:java:c......
  • Java文件操作实例浅析
    Java文件操作实例浅析1.   实例一:创建文件和目录在java.io包中有一个专门用于文件操作的类File类。此类提供了文件很多操作,如创建文件、删除文件、创建目录、删除目录等......
  • C、C++、Java语言中异常处理机制浅析
    C、C++、Java语言中异常处理机制浅析一、    异常处理(ExceptionalHandling)概述1.    异常处理异常处理又称异常错误处理,它提供了处理程序运行时出现任何意外或......
  • java安全组放行
    使用JAVA虚拟机,被安全阻止   解决:控制面板找到JAVA应用,配置JAVA   选择安全属性,编辑站点列表,并点击确定完成修改  ......
  • JAVA整合阿里云OSS/VUE上传阿里云OSS
    前言今天码帮帮系统已经整合到上传项目案例的功能了,这里有一些图片资源需要上传,之前做项目对接过七牛云,也有使用过阿里云的视频点播服务,不过这次对接阿里云的OSS确实有点......
  • 最新java面试题及答案(基础篇)
     如今IT仍是热门行业,面试程序员的人也非常多,那么,怎样才能顺利通过面试呢?2021最新java面试题及答案(基础篇),为你的面试助攻!1、Java中的内存溢出是如何造成的?OutOfMemoryEr......
  • JAVA实现数据脱敏(结合Spring)
    前言这个数据脱敏是最近做的一个权限系统的功能,我们这个权限系统包含菜单权限,操作权限,数据权限,字段权限,其中字段权限就是控制字段根据不同的角色隐藏或者显示,这个和数据......
  • Java面试题大汇总
    Java面试题及答案(2023版),适用于应届生、用工作经验的程序员,每道都是认真筛选出的高频面试题,助力大家能找到满意的工作!下载链接:全部面试题及答案PDF1:阿里巴巴Java面试题......