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() 返回一个多行字符串,其中包含语法错误及其索引的说明、错误的正则表达式模式以及模式内错误索引的可视指示。 |
文章浏览阅读2.4w次,点赞9次,收藏79次。Docker部署安装Nginx_docker安装nginx
文章浏览阅读1.2k次。文件读写其实说简单也简单,会用即可,说复杂也复杂,操作系统文件系统有很多东西需要学习。在此简单介绍一种写日志与读日志的方法——写一行&读一行。1.写一行代码:#include void writeLogLine(const char *fileName,const char *content)//参数:文件全名,写入内容{FILE *fp;//定义文件指针if ((fp=fopen(fil..._c写文件循环一次写一行
文章浏览阅读1.4k次,点赞26次,收藏24次。315M发射电路原理以及315M无线模块怎么使用_315m 放大电路
文章浏览阅读1.5k次。金蝶精斗云旗下的财务软件有很多款,其中有一款云报销的产品有免费版,不过金蝶精斗云的云报销虽然是永久免费的,但是功能和权限相对也会更少一些,所以不一定适合你公司。金蝶精斗云旗下产品针对不同的行业、企业的不同规模,产品各有侧重点,可以根据你公司的实际需要挑选,每一款产品根据功能的多寡,价格也是不一样的。金蝶精斗云财务软件是按年收费的。金蝶精斗云旗下的产品包括云会计(财务管理工具),云进销存(采购、销售..._精斗云永久免费
文章浏览阅读396次。mybatis批量插入数据_批量提交insrt
文章浏览阅读52次。阅读目录MSCache能做什么?从IMemoryCache说起开发者的体验写在最后 Cache是一个绝大多数项目会用到的一个技术,说起到缓存可能就联想到 Set、Add、Get、Remove、Clear 这几个方法。那么在.NET Core中微软给我们带来了什么样的缓存体验呢?今天我们就来介绍下”Microsoft.Extensions.Caching.Memory...__memorycache.getorcreate absoluteexpirationrelativetonow 需要与set一起使用嘛
文章浏览阅读192次。【TechWeb报道】虽然不少手机尚未升级至安卓6.0系统,但是安卓6.0.1却来了。近日,谷歌已经开始推送Android 6.0.1,本次更新的幅度并不大,将会主要以修复bug和优化性能为主,并且此次更新不会改版Android系统的版本号,而包括Nexus 5x、Nexus 6P最新的系统版本依然是Android 6.0。另外,Android 6.1将于明年年初发布,不用说,Android 6...._安卓版本6.0.1高还是6.0
文章浏览阅读8k次,点赞4次,收藏2次。FeignClient url_@feignclient url
文章浏览阅读4.8k次,点赞17次,收藏81次。第一次接触Shader Graph 是在18年7月份Shader Graph最佳实践 (Best practices for Shader Graph - Unite 2018 洛杉矶)Unity着色器Procedural绘图简介(非Node/代码逻辑)原解读Unity2018中 ShaderGraph 示例: Procedural[Shader Graph备忘录1]扫描线..._shader graph 毛刺效果
文章浏览阅读9.1k次,点赞2次,收藏9次。一、初识Jmeter1、Jmeter的文件结构:(1)binjmeter的启动文件以及配置文件。jmeter的默认保存文件路径,也是在jmeter的bin文件夹里;读取文件,默认也是该文件夹。(2)docs文档,开发人员看的接口api文档,如果你要对jmeter进行二次开发,需要阅读此文档。(3)printable_docs文档,这是Jmeter的使用帮助文档(离线帮助)。(4)liblibrary库,存放jmeter源码打成的jar包,以及第三方人员开发的扩展功能jar_jmeter默认保存路径
文章浏览阅读2.4k次。The FactorySoft OPC Server 最近在看opc的东西,一开始看的是潘爱民的《COM原理与应用》,这本书买了老早了,几年前领导想在在组态王6.03里面添加我们公司的设备的驱动,到北京组态王的总部去了一趟,没接触过怎么做组态王的驱动,请教了接待我们的MM经理,她说很简单,用到了COM和C++,下午就去了书店买了回来,后来安装上开发包研究了下,书也没看就把驱动写完了,一直放到现在。 后来做工控的上位,西门子的PLC使用的最多,所以_组态王fsserver
文章浏览阅读514次。【代码】Linux:字符串数组和字符串指针的定义赋值操作。_linux字符串赋值