java正则表达式入门及API实例

Java小白从入门到精通,Java零基础入门看这一篇就够了 作为刚刚接触java的小白,今天这篇文章的目的是帮助大家快速入门java,少走弯路 如何快速入门Java? 一、作为刚接触Java的新手,先了解Java的基础。 Java 基本语法、Java 平台应用、Java的核心概念:JVM、JDK、JRE以及Java面向对象思想,同时要会学到如何在系统中搭建Java开发环境,以及如何利用第三方工具进行Java程序的开发。 还有记住学习Java语言最重要的是两点: 学习步骤/方法 学习资源 找到适合自己的学习方式,找到适合自己现阶段的学习资料,学习的过程中最好记笔记,. 阅读详情
Cooking Regex微信公众号
正则表达式学习

 

一、正则表达式语法

1、语法

2、java API文档里面的介绍

如果觉得2这一部分有点多的话,直接看我这边的总结 :
******************************************总结***************************
①、java字符类中可以用&&表示且的意思
[a-z&&[def]] 表示d、e或f。既[a-z]和[def]的交集
[a-z&&[^bc]] 表示a到z,除了b和c。既从[a-z]中去掉[bc]
[a-z&&[^m-p]] 表示a-z中去掉[m-p]后的集合
 
②、特殊构造(非捕获)
(?:X)X,作为非捕获组
(?idmsux-idmsux) Nothing,但是将匹配标志idmsux on - off
(?idmsux-idmsux:X)  X,作为带有给定标志 i d m s u x on - off
(?=X)X,通过零宽度的正 lookahead
(?!X)X,通过零宽度的负 lookahead
(?<=X)X,通过零宽度的正 lookbehind
(?<!X)X,通过零宽度的负 lookbehind
(?>X)X,作为独立的非捕获组
③、反斜杠、转义和引用

在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否非转义构造的一部分。
根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值"\b" 与单个退格字符匹配,而"\\b" 与单词边界匹配。字符串字面值"\(hello\)" 是非法的,将导致编译时错误;要与字符串(hello) 匹配,必须使用字符串字面值"\\(hello\\)"。
 
④、字符类运算符的优先级,从最高到最低的顺序排列
1    字面值转义    \x
2    分组[...]
3    范围a-z
4    并集[a-e][i-u]
5    交集[a-z&&[aeiou]]
⑤、组和捕获

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:

1    ((A)(B(C)))
2    \A
3    (B(C))
4    (C)

组零始终代表整个表达式。 

之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器获取。

与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串"aba" 与表达式(a(b)?)+ 相匹配,会将第二组设置为"b"。在每个匹配的开头,所有捕获的输入都会被丢弃。

以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。

 
*******************************总结结束*******************************************
 
 
 
【学习技巧】: 在学习写正则表达式的时候,可以先在一些工具上面进行一些校验,这样可以很方便的进行初步校验你写的正则表达式的正确性。如你可以用OpenOffice,在百度搜索下就可以了,个人觉得这个工具还算不错,当然还有很多其他文本工具。

二、java API及实例

1、组group()、group(i)、groupCount()

     // 按指定模式在字符串查找
	      String line = "AK47! OK?";
	      String pattern = "([A-Z]+)(\\d+)(.*)";	 
	      // 创建 Pattern 对象
	      Pattern r = Pattern.compile(pattern);	 
	      // 现在创建 matcher 对象
	      Matcher m = r.matcher(line);
	      int groupCount=m.groupCount();
	      if (m.find()) {
	    	  for(int i=0;i<=groupCount;i++){
	    		  System.out.println("group("+i+"):"+m.group(i));
	    	  }
	      } else {
	         System.out.println("NO MATCH!");
	      }
	   }

运行结果:
说明:
从运行结果可以看出,([A-Z]+)(\\d+)(.*)这个正则表达式有四个分组:
0代表整个分组 ([A-Z]+)(\\d+)(.*)
1代表组 ([A-Z]+)
2代表组 (\\d+)
3代表组 (.*)
 
那为什么groupCount返回的结果却是3呢?原因是0不在groupCount()的计算返回值之内,group(0)比较特殊,代表的是整个表达式。从上面的结果来看,组()可以用来缓存匹配的数据,以便于后面的处理。但有时候有些组我们不需要获取它匹配到的值,这时候我们可以用(?:)来表示非捕获组,例如上面的例子中我们把正则表达式改为(?:[A-Z]+)(\\d+)(?:.*),则运行结果如下:
这个时候被?:修饰的那两个组都变为非捕获组,此时它们匹配到的内容不会被捕获保存到组里面,所以只剩下一个(\\d+)会捕获到数据,groupCount()返回的值为1。

2、获得索引start()、end()、start(group)、end(group)

		 
	      // 按指定模式在字符串查找
	      String text = "AK47! 12ksdjfk445OK?";
	      String regex = "\\d+";	 
	      // 创建 Pattern 对象
	      Pattern r = Pattern.compile(regex);	 
	      // 现在创建 matcher 对象
	      Matcher m = r.matcher(text);
	      System.out.println("input:"+text);
	      System.out.println("regex:"+regex+"\n");
	      while(m.find()) {
	    	  System.out.println("匹配到:"+m.group()+"\t开始位置为:"+m.start()+"\t结束位置为:"+m.end());
	 
	      }
	   

运行结果为:
从结果中可以看出,group()会把与模式匹配的数字依次找出来,而strar()和end()会把匹配到的字符的位置返回,其中start()包含返回的位置,end()不包含。例如47的位置为索引2到4,但不包括4这个位置。
 

3、匹配matches()、lookingAt()

		 
	      // 按指定模式在字符串查找
	      String text = "47AN";
	      String regex = "\\d+";	 
	      // 创建 Pattern 对象
	      Pattern r = Pattern.compile(regex);	 
	      // 现在创建 matcher 对象
	      Matcher m = r.matcher(text);
	      System.out.println("input:"+text);
	      System.out.println("regex:"+regex+"\n");
	 
	     System.out.println("lookingAt:"+m.lookingAt());
	     System.out.println("matches:"+m.matches());
	   

运行结果:
而如果把input改为AN47,结果为:
从上面的运行结果对比可以看出,lookingAt()是从整个字符串的开头去匹配,也就是从左到右去匹配,只要最开头的字符有满足模式的,它就会返回true(不管后面的字符会不会继续满足模式),否则为false;而matches()是需要字符串匹配整个模式才能方法true。例如我们平时用来校验身份证号或手机号码的匹配就是用到matches()这个方法。

4、替换replaceAll()、replaceFirst()

  // 按指定模式在字符串查找
	      String text = "AN47 java2 C# .Net5";
	      String regex = "\\d+";	 
	      // 创建 Pattern 对象
	      Pattern r = Pattern.compile(regex);	 
	      // 现在创建 matcher 对象
	      Matcher m = r.matcher(text);
	      System.out.println("input:"+text);
	      System.out.println("regex:"+regex+"\n");
	 
	      System.out.println("replaceAll替换后为:"+m.replaceAll("0"));
	      System.out.println("replaceFirst替换后为:"+m.replaceFirst("0"));

运行结果为:
从运行结果可以看出replaceAll()会把所有匹配的数字都替换为0,而replaceFirst()只是把第一个替换为0。

另外,appendReplacement()、appendTail()也可以用来处理替换

		 
	      // 按指定模式在字符串查找
	      String text = "AN47 java2 C# .Net5 php";
	      String regex = "\\d+";	 
	      // 创建 Pattern 对象
	      Pattern r = Pattern.compile(regex);	 
	      // 现在创建 matcher 对象
	      Matcher m = r.matcher(text);
	      System.out.println("input:"+text);
	      System.out.println("regex:"+regex+"\n");
	      StringBuffer result=new StringBuffer();
	      while(m.find()){
	    	  m.appendReplacement(result, "0");
	      }
	     // m.appendTail(result);
	      System.out.println("替换后为:"+result);
	   }
	

运行结果:
可以看出,替换成功了。但你有没有发现返回的结果少了点什么?跟input比较,可以发现php不见了,这是为什么呢?原因是我把m.appendTail(result)这一句注释掉了,这一句的作用是把尾部没有匹配的字符添加到返回的结果result中,也就是说,一般情况下,appendReplacement()和appendTail()是配套使用的。我们去掉注释后,再来看看运行结果:
这时候php就回来了
 

5、格式化数据

 public static void main(String args[]){
		   String input="20161209,20161210,20161211";
		   forMat1(input, '-');
		 
	   }
	   
	   public static void forMat1(String input,char separator){
		   String regex="(\\d{4})(\\d{2})(\\d{2})";
		   Matcher m=Pattern.compile(regex).matcher(input);
		   while(m.find()){
			   System.out.print(m.group()+"\t格式化后为:");
			   System.out.println(m.group(1)+separator+m.group(2)+separator+m.group(3));
		   }
	   }

运行结果:
 public static void main(String args[]){
		   String input="20161209,20161210,20161211";
		   forMat2(input, '-');		 
	   }	   
	   
	   public static void forMat2(String input,char separator){
		   String regex="(\\d{4})(\\d{2})(\\d{2})";
		   String format="$1"+separator+"$2"+separator+"$3";
		   Matcher m=Pattern.compile(regex).matcher(input);
		   while(m.find()){
			   System.out.print(input+"\t格式化后为:");
			   System.out.println(m.replaceAll(format));
		   }
	   }
运行结果:

 
咱们继续学Java——高级篇 第三十九篇:之正则表达式API总结与XML入门 在Java编程的学习旅程中,我们始终秉持着共同探索、共同提升的精神。此前我们深入学习了正则表达式的查找、替换和分割等操作,今天我们将首先对正则表达式相关的API进行全面总结,巩固我们对正则表达式的运用能力,然后开启新的篇章——XML的学习,了解XML的基本概念及其在处理结构化信息方面的优势,这将为我们后续深入学习XML的各种操作和应用奠定基础。 阅读详情

相关推荐

PVE 9.0 保姆级安装及优化教程(换源、网络配置、远程唤醒等)【基础篇】

最近,Proxmox VE 推出了基于 Debian 13 的 9.0 版本。正巧我手头有一台闲置的老电脑,与其闲置,不如装上 PVE,让它化身 All in One,继续发挥它的余热。G4560 算是一颗 NAS 神 U,十几元的售价就能有双核四线程,比起什么 J1900 不知道强到哪里去了,尽管定位上是奔腾处理器,但性能甚至能和同代的酷睿 i3-7100 掰掰手腕,并且它还自带 HD 610 的核显,对于解码的支持也还不错。

zc_mk的博客 7511

Java 正则表达式(深度长文)

Java正则表达式(深度长文)

senxu_的博客 7万+

从晶体管到触发器:为什么芯片设计必须区分同步/异步复位?

本文深入探讨了芯片设计中同步复位与异步复位的物理本质与工程权衡。从晶体管级的CMOS结构出发,剖析了两种复位方式在物理实现、时序可靠性(如建立/保持时间、恢复/移除时间)上的根本差异,并分析了在不同应用场景下的选择策略。文章强调,理解复位信号的底层机制对于确保芯片时序收敛、系统上电确定性及整体鲁棒性至关重要。

time3的博客 221

java正则表达式

目录 一、概念 二、正则表达式语法 三、捕获组 四、Pattern类与Matcher类 1.matches( ) 2.split( ) 3.find( ) 4.group 5.start( )和end( ) 6.replace替换 7.reset( ) 8.代码演示 五、正则表达式在Java中的应用 1.判断功能 2.分割功能 3.替换功能 一、概念 正则表达式(regex)是一个字符串,由字面值字符和特殊符号组成,是用来描述匹配一个字符串集合的模式,可以用来匹配、.

m0_62618110的博客 6万+

数据结构实验1.2—高精度计算PI值(西工大)

这是数据结构第二题的题目,是让我们根据用户的需求来计算派的值 这是题目的详细描述,刚看到这道题的时候,我是真的头大,完全没有思路,于是查找了一些大佬的笔记后才开始编写 这是我在写这些代码是所运用到的数学反三角函数幂次展开式的知识。 下面是正确的代码以及我的一些见解,和需要注意的一些地方。希望能对你有所帮助。如有更加精简的算法,请在评论区留下你的算法!!!谢谢!!! #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdl

abcdef0623的博客 5831

Isaac Sim仿真平台学习(2)系统架构

isaac sim系统架构

weixin_75067193的博客 2698

【Java 基础篇】Java 正则表达式

本篇博客介绍了 Java 正则表达式的基本概念、语法和常用操作。我们学习了如何创建正则表达式模式对象、匹配器对象,以及如何使用它们进行字符串的匹配、提取和替换操作。正则表达式在 Java 程序中具有广泛的应用,可以帮助我们处理文本数据,提取关键信息,进行格式验证等。通过灵活运用正则表达式,我们可以更高效地处理字符串操作。希望本篇博客对你理解和使用 Java 正则表达式有所帮助。祝你在 Java 编程中取得更多的成功!

繁依Fanyi的博客 1万+

VisualStudio2022配置CGAL

vs2022和vs2017安装配置boost没什么区别,只需要注意boost的msvc得是14.3的,这玩意跟visualstudio版本挂钩的。压缩包解压,得到下面这两文件,然后把auxiliary这个文件挪到CGAL-5.6里面就行了。我用cgal读取一个stl模型,并输出相关信息(想可视化的话需要安装Qt,不想装Qt也可以装VTK)然后下载下面这两个压缩包。照着下面的截图填就完事了。

weixin_43850909的博客 1171

Java中的正则表达式

一、概念 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。在众多语言中都可以支持正则表达式,如Perl、PHP、Java、Python、Ruby等。当然在Java中也可以通过处理字符串的方式达到检索,替换文本字符串的目的,但是有了正则表达式写代码更加简洁,通常两三行代码就可以达到目的,当然这也是建立在熟悉正则表达式的基础之上的。 ...

qq_52252193的博客 4423

深入浅出:.sh文件在Linux系统中的实战应用与技巧

本文深入浅出地介绍了.sh文件在Linux系统中的实战应用与技巧。从基础概念入手,详细讲解了Bash脚本的运行方法、权限管理,并通过编写自动化备份脚本等实例,展示了如何利用Shell脚本提升工作效率。文章还涵盖了脚本调试、错误处理以及函数、参数解析等进阶技巧,帮助读者从入门到精通,掌握这一强大的自动化工具。

weixin_29243279的博客 348

ZYNQ PL通过EMIO ETHE1外接PHY由GMII转RGMII

1,设置EMIO方式引出ETHE1 2,从GMII过度到RGMII GMII: 发送 gmii_tx_clk gmii_tx_d[7:0] gmii_tx_en gmii_tx_er 接收 gmii_rx_clk gmii_rx_d[7:0] gmii_rx_dv gmii_rx_er RGMII: 发送 tx_clk tx_d[3:0] tx_ctrl 接收 rx_clk rx_d[3:0] rx_ctrl 首先数据总线从时钟单边沿采样8bit转变为了双边沿采样4bit,从88E1

wangjie36的博客 1万+

正则表达式(java)

除了上面提到的\d\D\s\S等预定义字符类外,Java还支持其他一些预定义字符类,如\w(匹配任何单词字符,等价于)和\W(匹配任何非单词字符,等价于。

ran_lian的博客 5859

【WRF工具】WRF 模型输出可视化工具 plotfmt

【WRF工具】WRF 模型输出可视化工具 plotfmt

WW、forever的博客 1292

Java 正则表达式里的 groupCount

一开始学习Java正则表达式,总会错误的API当成理所当然的来使用,结果得来的就是花更多的时间工作。今天就遇到了,正则表达式里的Matcher类的groupCount。 首先看看,Java如何创建正则表达式: Pattern p=Pattern.compile("([a-z]+)(\\d+)([a-z]+)(\\d)"); Matcher m=p.matcher("aaa2223bb

wp562846864的专栏 9264

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java正则表达式及api_java正则表达式及api

正则表达式 实质上是一个模式,用于描述共享该模式的一组字符串 例如:test stringtest longer string这些字符串都是以"Test”开头,并以“String” 结尾java语言中,通过Java language Regular Expression(或 regex)来实现正则表达式API如下:* Pattern,描述了一个字符串模式。* Matcher,测试字符串,查看它是否...

weixin_34218582的博客 523

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JAVA常用API - 正则表达式

大家好,我是最爱吃兽奶,今天给大家介绍一下正则表达式,跟着我的脚步一起去看看吧!一,正则表达式是什么?正则表达式是一种用来匹配和处理文本的工具,它可以用一些特定的符号和语法来描述一类字符串的模式。在计算机科学和各种编程语言中,正则表达式被广泛应用于文本搜索、替换、过滤、验证等方面。通过正则表达式,我们可以轻松地匹配出符合某种模式的文本,例如匹配电子邮件地址、电话号码、网址等。从而实现各种文本处理的功能。

weixin_73869209的博客 2471

JAVA基础(常用API) —— 正则表达式

正则表达式、 爬虫、爬取的分类:贪婪爬取和非贪婪爬取以及分组的分类:捕获分组和非捕获分组

hdakj22的博客 826

java正则表达式语法详解及其使用代码实例

java正则表达式语法详解及其使用代码实例

qq_43680149的博客 1346

JAVA正则表达式api

Java 提供了功能强大的正则表达式API,在java.util.regex 包下。整理一点常用的api。 Pattern 正则表达式经编译后的表现模式,必须先将正则表达式(字符串形式)编译成此实例。 获取Pattern实例 构造器是私有的,可通过如下方法获取实例: Pattern pattern = Pattern.compile("\\d"); Matcher 匹配器,一个Matcher对象...

fyzzz9的博客 1146

深入正则表达式API

目录前言正则表达式的使用诉求java.util.regex包java.lang.String实例最短路径实现诉求Java支持的正则表达式功能语法总结参考 前言 正则表达式作为文本处理的利器,早已成为各大语言的必要装备,但各语言对其的实现程度(功能语法支持程度)和 API 设计均有所差异,本篇将目光投向 java 原生类库中提供的正则表达式 API — java.util.regex 包和 java.lang.String 实例方法,和所支持的功能语法上。 正则表达式的使用诉求 正则表达式一般用于处理如下诉求

weixin_43395262的博客 276

Java(API)——正则表达式

正则表达式是,并用来匹配字符串。例如,判断手机号,我们用正则表达式\d{11}eg:要判断用户输入的年份是否是20##年,我们先写出规则如下:200~9任意数字0~9任意数字。20\d\d,其中\d。把正则表达式转换为Java字符串就变成了20\\d\\d注意Java字符串用\\表示。

weixin_63179206的博客 2040

Java 正则表达式

Java 提供了功能强大的正则表达式API,在java.util.regex 包下。本教程介绍如何使用正则表达式API。 正则表达式 一个正则表达式是一个用于文本搜索的文本模式。换句话说,在文本中搜索出现的模式。例如,你可以用正则表达式搜索网页中的邮箱地址或超链接。 正则表达式示例 下面是一个简单的Java正则表达式的例子,用于在文本中搜索 http://

com360的专栏 1954

java正则表达式总结和实例

字符串处理是许多程序中非常重要的一部分,它们可以用于文本显示,数据表示,查找键和很多目的.在Unix下,用户可以使用正则表达式的强健功能实现这些目的,从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础工具,可以用于很多类型的文本处理, 如匹配,搜索,提取和分析结构化内容. java.util.regex是一个用正则表达式所订制的模式来对字符串

411

正则表达式入门(java,python版本)

目录 正则表达式基础 正则表达式实现 正则表达式应用 本文目标快速让你知道真这个表达式是什么,对正则表达式的概念有基本的了解,并且能够在不同的编程语言中使用它。 正则表达式到底是什么 正则表达式,(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。 注意上文加粗

感谢那一段回忆里的疯狂,在我们最无谓的岁月闪着光。 1958

java正则表达式实例

pattern matcher string.split(“表达式”,str); string.replaceAll("",str); pattern.split(str); \d 数字 \D 非数字 \w 单字字符(0-9,A-Z,a-z) \W 非单字字符 \s 空白(空格符,换行符,回车符,制表符) \S 非空白 [] 由方括号内的一个字符列表创建的自定义字符类 . 匹配任何单个字符 下面的字符将用于控制将一个子模式应用到匹配次数的过程. ? 重复前面的子模式0次到一次 重复前面的子模式0次或多次

cofeeFang的博客 338
上一篇: Java 正则表达式的总结和一些小例子(验证和修改过的版本)
下一篇: java 正则表达式报错:Look-behind group does not have an obvious maximum length near index
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值