Java为使用正则表达式进行模式匹配提供了java.util.regex包,Java正则表达式非常类似于Perl编程语言,并且非常容易学习。
regex包主要由以下三个类组成
Pattern class - Pattern对象是正则表达式的表示形式,没有提供公共构造函数。
Matcher class - Matcher对象是解释模式并对输入字符串执行匹配操作的引擎。
PatternSyntaxException - PatternSyntaxException对象是一个未检查的异常,指示正则表达式模式中的语法错误。
捕获组是一种将多个字符视为一个单元的方法。如正则表达式(Dog)创建一个包含字母“ d”,“ o”和“ g”的单个组。
捕获组通过从左到右计数其左括号进行编号。如在表达式(A)(B(C)中,存在四个这样的组-
若要了解表达式中存在多少个组,请对Matcher 对象调用groupCount方法,groupCount方法返回一个int,显示匹配器模式中存在的捕获组的数量。
还有一个特殊的组,组0,它始终表示整个表达式,此组不包括在groupCount报告的总数中。
以下示例说明如何从给定的字母数字字符串中查找数字字符串
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public static void main( String args[] ) { //要扫描的字符串以查找模式。 String line = "This order was placed for QT3000! OK?"; String pattern = "(.*)(\\d+)(.*)"; //创建Pattern对象 Pattern r = Pattern.compile(pattern); //现在创建匹配器对象。 Matcher m = r.matcher(line); if (m.find( )) { System.out.println("Found value: " + m.group(0) ); System.out.println("Found value: " + m.group(1) ); System.out.println("Found value: " + m.group(2) ); }else { System.out.println("NO MATCH"); } } }
这将产生以下输出-
Found value: This order was placed for QT3000! OK? Found value: This order was placed for QT300 Found value: 0
下面的表列出了java-中可用的所有正则表达式元字符语法
Subexpression | Matches |
---|---|
^ | 匹配行的开头。 |
$ | 匹配行的结尾。 |
. | 匹配除换行符以外的任何单个字符。 |
[...] | 匹配括号中的任何单个字符。 |
[^...] | 匹配任何不在方括号中的单个字符。 |
\A | 整个字符串的开头。 |
\z | 整个字符串的结尾。 |
\Z | 整个字符串的结尾,但允许的最后一行终止符除外。 |
re* | 匹配0个或多个 |
re+ | 匹配1个或多个 |
re? | 匹配0或1个。 |
re{ n} | 精确匹配n个。 |
re{ n,} | 至少匹配n个。 |
re{ n, m} | 至少匹配n个,最多匹配m个。 |
a| b | 匹配a或b。 |
(re) | 分组匹配 |
(?: re) | 分组匹配,而无需记住匹配的文本。 |
(?> re) | 匹配独立模式而不回溯。 |
\w | 匹配单词字符。 |
\W | 匹配非单词字符。 |
\s | 匹配空白。 等效于[\t\n\r\f]。 |
\S | 匹配非空格。 |
\d | 匹配数字。 相当于[0-9]。 |
\D | 匹配非数字。 |
\A | 匹配字符串的开头。 |
\Z | 匹配字符串的结尾。 如果存在换行符,则匹配换行符。 |
\z | 匹配字符串的结尾。 |
\G | 匹配最后结束点。 |
\n | 匹配换行“n”。 |
\b | 匹配单词边界。 |
\B | 匹配非单词边界。 |
\n,\t, etc. | 匹配换行符,回车符,制表符等。 |
\Q | 转义(引号)所有字符,直到\E。 |
\E | 结束语以\Q开头。 |
索引方法提供有用的索引值,这些索引值精确地显示了在输入字符串-中找到匹配的位置
Sr.No. | Method & Remark |
---|---|
1 | public int start() 返回上一个匹配项的开始索引。 |
2 | public int start(Int Group) 返回给定组在上一次匹配操作期间捕获的子序列的开始索引。 |
3 | public int end() 返回匹配的最后一个字符之后的偏移量。 |
4 | public int end(Int Group) 返回在上一个匹配操作期间由给定组捕获的子序列的最后一个字符之后的偏移量。 |
查找方法检查输入字符串并返回一个布尔值,指示是否找到-模式
Sr.No. | Method & Remark |
---|---|
1 | public boolean lookingAt() 尝试将输入序列与模式进行匹配,从开头开始。 |
2 | public boolean find() 尝试查找与模式匹配的输入序列的下一个子序列。 |
3 | public boolean find(Int Start) 重置此匹配器,然后尝试查找与模式匹配的输入序列的下一个子序列,从指定的索引处开始。 |
4 | public boolean matches() 尝试将整个区域与模式进行匹配。 |
替换方法是用于替换输入字符串中的文本的有用方法
Sr.No. | Method & Remark |
---|---|
1 | public Matcher appendReplace(StringBuffer sb,String replacement) 实现追加和替换操作。 |
2 | public StringBuffer appendTail(StringBuffer sb) 实现终端附加和替换步骤。 |
3 | public String replaceAll(String replacement) 用给定的替换字符串替换与模式匹配的输入序列的每个子序列。 |
4 | public String replaceFirst(String replacement) 用给定的替换字符串替换与模式匹配的输入序列的第一个子序列。 |
5 | public static String quoteReplace(string s) 返回指定字符串的文字替换字符串。此方法生成一个字符串,该字符串将作为Matcher类的appendReplace方法中的文字替换。 |
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "\\bcat\\b"; private static final String INPUT = "cat cat cat cattie cat"; public static void main( String args[] ) { Pattern p = Pattern.compile(REGEX); Matcher m = p.matcher(INPUT); //获取匹配器对象 int count = 0; while(m.find()) { count++; System.out.println("Match number "+count); System.out.println("start(): "+m.start()); System.out.println("end(): "+m.end()); } } }
这将产生以下输出-
Match number 1 start(): 0 end(): 3 Match number 2 start(): 4 end(): 7 Match number 3 start(): 8 end(): 11 Match number 4 start(): 19 end(): 22
matches和lookingAt方法都试图将输入序列与模式进行匹配。然而,不同的是,matches要求匹配整个输入序列,而lookingAt不需要。
这两种方法始终从输入字符串的开头开始。下面是解释函数-的示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "foo"; private static final String INPUT = "fooooooooooooooooo"; private static Pattern pattern; private static Matcher matcher; public static void main( String args[] ) { pattern = Pattern.compile(REGEX); matcher = pattern.matcher(INPUT); System.out.println("Current REGEX is: "+REGEX); System.out.println("Current INPUT is: "+INPUT); System.out.println("lookingAt(): "+matcher.lookingAt()); System.out.println("matches(): "+matcher.matches()); } }
这将产生以下输出-
Current REGEX is: foo Current INPUT is: fooooooooooooooooo lookingAt(): true matches(): false
replaceFirst和replaceAll方法替换与给定正则表达式匹配的文本。顾名思义,replaceFirst替换第一个匹配项,replaceAll替换所有匹配项。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "dog"; private static String INPUT = "The dog says meow. " + "All dogs say meow."; private static String REPLACE = "cat"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); //获取匹配器对象 Matcher m = p.matcher(INPUT); INPUT = m.replaceAll(REPLACE); System.out.println(INPUT); } }
这将产生以下输出-
The cat says meow. All cats say meow.
Matcher类还为文本替换提供appendReplace和appendTail方法。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "a*b"; private static String INPUT = "aabfooaabfooabfoob"; private static String REPLACE = "-"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); //获取匹配器对象 Matcher m = p.matcher(INPUT); StringBuffer sb = new StringBuffer(); while(m.find()) { m.appendReplacement(sb, REPLACE); } m.appendTail(sb); System.out.println(sb.toString()); } }
这将产生以下输出-
-foo-foo-foo-
PatternSyntaxException是一个未经检查的异常,它指示正则表达式模式中的语法错误。PatternSyntaxException类提供以下方法来帮助您确定错误的-
Sr.No. | Method & Remark |
---|---|
1 | public String getRemark() 检索错误的说明。 |
2 | public int getIndex() 检索错误索引。 |
3 | public String getPattern() 检索错误的正则表达式模式。 |
4 | public String getMessage() 返回一个多行字符串,其中包含语法错误及其索引的说明、错误的正则表达式模式以及模式内错误索引的可视指示。 |
文章浏览阅读289次。快解析有24小时不间断技术服务支持,用户遇到任何技术商问题都可以随时得到帮助,而这项专业的1V1定制服务是行业内独有的,它的各项功能在同类型的品牌产品中是极具性价比的。另外,要特别一提的是,随着企业对人力资源管理重视的加强,已经有越来越多的 ERP 厂商将人力资源管理纳入了 ERP 系统的一个重要组成部分。ERP是指建立在信息技术基础上,通过先进管理思想和方法,对企业内部资源和外部资源进行整合,通过标准化的数据和业务操作流程,把企业的人、财、物等进行紧密集成,最终实现资源优化配置和业务流程优化目的的方法。_erp远程交付
文章浏览阅读306次,点赞4次,收藏8次。哈希是一种处理数据的方式,其基本思想是将原始特征空间的数据点映射成哈希码空间的二进制码,同时也保存了每一对数据点之间的相似性。_哈希映射二值空间
文章浏览阅读4.7k次。我们有可能需要利用多线程来实现并行绘图。但是,这里面经常会有这样一个问题:多个线程都需要使用同一个GDI对象进行绘制。进而引申出来的问题是:多个不同的线程能否同时操作同一个GDI对象? 首先看MSDN里官方的document 描述(在MSDN里搜索“Multiple Threads and GDI Objects”): To enhance performance, acc_gdi 并行绘制
文章浏览阅读118次。水质EC控制器采用中文菜单操作,人性化设计,具有稳定性高、重复性能优越、功能齐全等特点,能精确测量溶液中的EC值和温度值。广泛用于环保、污水处理、火电、养殖、食品加工、冶金、化工、自来水、印染、造纸、制药、发酵、电镀等领域中EC(电导率)的在线监测。水质EC控制器特点(1)可进行EC的测量,上下限控制。(2)可设置0~60℃温度自动补偿。(3)EC高限报警,低限报警双路继电器,迟滞量可自由调整。(4)隔离变送4~20mA输出,可任意设置(迁移和反转)量程范围..._隆云通 说明书
文章浏览阅读7.3k次,点赞6次,收藏9次。转自: https://blog.csdn.net/qq_22803691/article/details/86574912打开Idea设置,先创建一个xml模板<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"..._idea中xml的config
文章浏览阅读1.8k次。一、什么是集群? 集群(Cluster)是由两台或多台节点机(服务器)构成的一种松散耦合的计算节点集合,为用户提 供网络服务或应用程序(包括数据库、Web服务和文件服务等)的单一客户视图,同时提供接近容错机的故 障恢复能力。集群系统一般通过两台或多台节点服务器系统通过相应的硬件及软件互连,每个群集节点都 是运行其自己进程的独立服务器。这些进程可以彼此通信,对网络客户机来说就像是形成了一个单一系_什么是集群响应数据
文章浏览阅读4.6w次,点赞15次,收藏91次。简述仿射变换是二维坐标间的线性变换,故而变换后的图像仍然具有原图的一些性质,包括“平直性”以及“平行性”,常用于图像翻转(Flip)、旋转(Rotations)、平移(Translations)、缩放(Scale operations)等,然而其实现的函数就是cv::warpAffine()下面我们将对warpAffine()函数进行介绍,并且实现图像的旋转和平移。warpAffine..._warpaffine
文章浏览阅读317次。电池的寿命链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1229时间限制: 1000 ms 内存限制: 65536 KB【题目描述】小S新买了一个掌上游戏机,这个游戏机由两节5号电池供电。为了保证能够长时间玩游戏,他买了很多5号电池,这些电池的生产商不同,质量也有差异,因而使用寿命也有所不同,有的能使用5个小时,..._电池的寿命csdn
文章浏览阅读4.4k次。大家都是要求注释掉,但不想这样,看了很多博客,快绝望的时候,用这个办法成功了文件:E:\android\app (工程文件目录) 下面的 build.gradle 文件 在这个文件中加入最后划线3行,保存即可,然后再retryapply plugin: 'com.android.application'android { compileSdkVersion 26 ..._testimplementation 'junit:junit:4.12' 指定源
文章浏览阅读7.8k次,点赞2次,收藏27次。Tutorials/Trace File Generation这部分教程描述了如何生成车辆轨迹文件。除了sumo以外,工具Tools/TraceExporter将被使用。_轨迹数据txt格式可以转换成trj格式吗
文章浏览阅读1.1w次,点赞104次,收藏221次。Linux权限相关内容详解_linux shell使用实验的原理
文章浏览阅读1k次。Android中Intent寻找目标组件的方式分为两种,一种是显式意图,另一种是隐式意图1.显式意图在通过Intent启动Activity时,需要明确指定激活组件的名称。在程序中,如果需要在本应用中启动其他的Activity时,可以使用显式意图来启动Activity,示例代码如下Intent intent=new Intent(this,Activity02.class);//创建Intent对象..._activity 显式