java流与文件——正则表达式

【0】README

0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——正则表达式 的相关知识;
0.2) there are my original source code below, and for them , please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter1/RegularExprTest.java


【1】正则表达式相关

1)正则表达式定义: 正则表达式用于指定字符串的模式, 你可以在任何需要定位匹配某种特定模式的字符串的情况下使用正则表达式;
2)看个荔枝:
[Ji]ava.+

  • 2.1)匹配下列形式的所有字符串:
    第一个字母是 J 或 j;
    接下来3个字母是 ava;
    字符串的其余部分是一个或多个任意的字符构成;

3)正则表达式的语法:

  • 3.1)字符类:是一个括在括号中的可选择的字符集,如[Jj], [0-9], [A-Za-z]或[^0-9]; (干货——正则表达式中的字符类[] )
  • 3.2)如果字符类包含 “-”,那么它必须是第一项或最后一项; 如果要包含“[”,那么它必须是第一项; 如果要包含“^”,那么它可以是除开始位置之外的任何位置。其中, 你只需要转义 “[” 和 “\”;
  • 3.3)有许多预定的 字符类: 例如\d(数字) 和 \p{Sc};
  • 3.4)大部分字符都可以与它们自身进行匹配;
  • 3.5)符号可以匹配任何字符;
  • 3.6)使用 \ 作为转义字符, 例如 . 匹配句号 而 \ 匹配反斜线;
  • 3.7) ^ 和 $ 分别匹配一行的开头和结尾;
  • 3.8)如果 X 和 Y 是 正则表达式, 那么XY 表示“任何X的匹配后面跟随Y的匹配”, X|Y表示 “任何 X 或 Y 的 匹配”;
  • 3.9)你可以将量词运用到表达式: X:X+(1个或多个), X*(0个或多个), 与 X?(0个或1个);(干货——将量词 + ,*,?运用到表达式)
    这里写图片描述

  • 3.10)默认情况下: 量词要匹配能够使整个匹配成功的最大可能的重复次数。你可以修改这种行为, 方法是使用后缀?或使用 后缀 + ;

  • 3.11)荔枝: 字符串cab 匹配 [a-z]ab, 但不匹配[a-z]+ab;

对以上荔枝的分析(Analysis): (干货——正则表达式中的贪婪匹配问题)

  • A1)第一种case中: 表达式[a-z]* 只匹配字符c, 字符ab 匹配剩余部分;
  • A2)第二种case中: 贪婪版本 [a-z]*+ 将匹配字符 cab, 模式 的剩余部分将无法匹配;
    这里写图片描述

  • 3.12)我们使用群组来定义子表达式, 其中群组用括号() 括起来: 例如, ([+-]?)([0-9]+);然后, 你可以询问模式匹配器, 让其返回每个组的匹配,或者用 \n 引用某个群组, 其中 n 是群组号(从 \1 开始); (干货——使用群组来定义子表达式,群组用括号() 括起来)

4)正则表达式的简单用法就是测试某个特定的字符串是否与他匹配,下面展示了如何用java 来编写这段程序:

  • 4.1)首先用 表示正则表达式的字符串构建一个 Pattern 对象
  • 4.2)然后从这个模式获得一个 Matcher, 并调用它的 matches 方法:
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(input);
if(mathcer.matches()) ......

这里写图片描述

  • 4.3)这个匹配器的输入可以是任何实现了 CharSequence 接口的类对象, 例如 String, StringBuilder 和 CharBuffer;
  • 4.4)在编译这个模式时, 你可以设置一个或多个标志,如:
Pattern pattern = Pattern.compile(patternString ,  Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE);

4.5)下面是所支持的六种标志:

  • 4.5.1)CASE_INSENSITIVE: 匹配字符时忽略字母的大小写, 默认情况下, 这个标志只考虑US ASCII 字符;
  • 4.5.2)UNICODE_CASE: 当与 CASE_INSENSTITIVE 组合时, 用 Unicode 字母的大小来匹配;
  • 4.5.3)MULTIINE: ^ 和 $ 匹配行 的开头和结尾, 而不是整个输入的开头和结尾;
  • 4.5.4)UNIX_LINES: 在多行模式中 匹配 ^ 和 $ 时, 只有 ‘\n’ 被识别成行终止符;
  • 4.5.5)DOTALL: 当使用这个标志时, . 符号匹配所有字符, 包括行终止符;
  • 4.5.6)CANON_EQ: 考虑 Unicode 字符规范 的等价性;

5)如果正则表达式包含群组, 那么 Matcher 对象可以揭示群组的边界, 下面的方法: (干货——正则表达式包含群组, 那么 Matcher 对象可以揭示群组的边界)

int start(int groupIndex)
int end(int groupIndex)将产生指定群组的开始索引和结束之后的索引;

这里写图片描述

  • 5.1)你可以直接通过调用下面的方法抽取匹配的字符串:
    String group(int groupIndex)
  • 5.2)群组0 是这个输入, 而用于第一个实际群组的索引是1. 调用 groupCount 方法可以获得全部群组的数量;
    这里写图片描述

  • 5.3) 嵌套群组是按照前括号排序的, 例如,我们有下面的模式:

( (1?[0-9]):([0-5][0-9]) [ap]m)和下面的输出 11:59am
  • 那么, 匹配器会报告下面 的群组:
    这里写图片描述
    这里写图片描述

6)通常你不希望用正则表达式来匹配全部输入,而只是想找出输入中一个或多个匹配的子字符串。

  • 6.1)可以用 Matcher 类的 find 方法 来查找匹配内容, 如果返回 true, 再使用 start 和 end 方法来查找匹配的内容:
while(matcher.find())
{int start=matcher.start();int end = matcher.end();String match = input.substring(start, end);......
}

这里写图片描述

7) Matcher类的 replaceAll 方法将 正则表达式出现的所有地方 都用 替换字符串来替换;

  • 7.1)如, 下面的指令将所有的数字序列都替换为 # 字符:
Pattern pattern = Pattern.compile("[0-9]+");
Mathcer matcher = pattern.matcher(input);
String output = matcher.replaceAll("#);
  • 7.2) 替换字符串可以包含对模式中群组的引用: $n 表示替换成第n 个数组, 因此我们需要用 $ 来表示在替换文本中包含一个 $ 字符;
  • 7.3)如果字符串包含 $ 和 \ , 但又不希望它们被解释为 群组的替换符, 那么就可以调用
matcher.replaceAll(Matcher.quoteReplacement(str));
replaceFirst() 方法将只替换的第一个出现;

这里写图片描述

  • 7.4) 最后, Pattern类有一个 split 方法, 它可以用 正则表达式来匹配边界,从而将输入分割成字符串数组;**
    • 7.4.1)看个荔枝: 下面的指令可以将输入 分割成标记, 其中分隔符是由可选的空白字符包围的标点符号:(干货——Pattern.split 方法参见“4.2” 中的荔枝)
Pattern pattern = Pattern.compile()"\\s*\\p{Punct}\\s*";
String[] tokens = pattern.split(input);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pandoc讲html转换为pdf,mac下利用Pandoc、LaTeX 转换markdown成html,pdf

环境所使用的插件有pandoc,tlmgr,fc-listcssbrew install pandoc由于mac ox 系统生成pdf 须要找到对应的编码集 全部还须要去下载LaTeX,进行安装html5使用tlmgr工具安装全部要的包先进行更新,若是提示所须要的字体没有找到安装gitsudo tlmgr update --se…

java程序连接kafka_Java的Kafka:构建安全,可扩展的消息传递应用程序

java程序连接kafka使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 当今的用户希望可以通过其计算机,手机,平板电脑或任何其他设备访问您的应用…

信息系html5论文,基于HTML5的智力游戏设计电子信息工程本科学生毕业论文.doc

基于HTML5的智力游戏设计电子信息工程本科学生毕业论文本科学生毕业论文(设计)题目(中文):基于HTML5的智力游戏设计(英文):Design of Intelligent Game Based on HTML5姓 名 xxx学 号 xxx院 (系) 电子与信息工程学院专业、年级 电子信息工程指导教师 xxx…

优先队列——左式堆

【0】README 0.1) 本文文字描述部分转自 数据结构与算法分析, 旨在理解 优先队列——左式堆 的基础知识; 0.2) 本文核心思路均为原创, 源代码部分借鉴 数据结构与算法分析 ; 0.3) for origin…

Class类中的getEnclosing*、getDeclared*与getDeclaringClass的区别

一、getEnclosing* 当前类在……中闭合Class<?>getEnclosingClass() 返回底层类的立即封闭类。 Constructor<?>getEnclosingConstructor() 如果该 Class 对象表示构造方法中的一个本地或匿名类&#xff0c;则返回 Constructor 对象&#xf…

java联接pg库_Java14:使用Java 14的新记录联接数据库表

java联接pg库您是否知道可以使用Java 14的预览记录功能将数据库表连接到Java Stream中&#xff1f; 阅读这篇简短的文章&#xff0c;并了解如何使用Speedment Stream ORM完成它。 我们将从如何设置您的项目开始。 建立 下载Java 14 。 转到Speedment Initializer并下载您的项目…

html5遍历集合数据,HTMLCollection集合能打印出来值,但是无法获取每一个值。

var imgs $("#pictureQueryTable img").prevObject[0].images;下图是上面这句打印出来的结果&#xff1a;console.log可以打印出来该集合的数据&#xff0c;但是无法获取该集合中的每一个值&#xff0c;打印该集合的length为0&#xff0c;所以也无法遍历该集合进行操…

优先队列——斜堆

【0】README 0.1&#xff09;本文部分内容转自  http://www.cnblogs.com/skywang12345/p/3638493.html&#xff0c; 旨在理解 优先队列——斜堆 的基础知识&#xff1b; 0.2&#xff09; for original source code , please visit https://github.com/pacosonTang/dataStruc…

Class的getResource与ClassLoader的getResource路径/问题

一、Class的getResource(String path)&#xff1a;URL 1、path 不以’/开头时&#xff0c;默认是从此类所在的包下取资源&#xff1b; 2、path 以’/开头时&#xff0c;则是从ClassPath根下获取&#xff1b; System.out.println(Test.class.getResource("")); Syste…

java 轻量级文件数据库_Java:如何创建轻量级数据库微服务

java 轻量级文件数据库基于云的Java数据库应用程序的数量每分钟都在增加。 许多组织部署了数百甚至数千个微服务实例。 但是&#xff0c;相对于运行时环境&#xff0c;大多数应用程序会带来惊人的不必要开销。 反过来&#xff0c;这会使应用程序运行更慢&#xff0c;运行成本更…

html中显示shell脚本的输出,网页从shell脚本中输入并显示结果

首先&#xff0c;不是在BASH脚本中使用$USERNAME。 $USERNAME是一个包含当前用户名的BASH变量。实际上&#xff0c;在BASH中使用UPPERCASE变量通常是一个糟糕的主意。大多数BASH环境变量都是大写字母&#xff0c;可能会导致混淆。让你的变量小写是个好习惯。此外&#xff0c;因…

优先队列——二项队列(binominal queue)

【0】README 0.1&#xff09; 本文文字描述部分转自 数据结构与算法分析&#xff0c; 旨在理解 优先队列——二项队列&#xff08;binominal queue&#xff09; 的基础知识&#xff1b; 0.2&#xff09; 本文核心的剖析思路均为原创&#xff08;insert&#xff0c;merge和del…

Class的getName、getSimpleName与getCanonicalName的区别

一、getName 除了数组外&#xff0c;其他的类都是输出类全名以 String 的形式返回此 Class 对象所表示的实体&#xff08;类、接口、数组类、基本类型或 void&#xff09;名称。 1、此类对象表示的是非数组类型的引用类型&#xff0c; 返回该类的二进制名称&#xff0c;Java…

apache.camel_Apache Camel 3.1 –即将推出更多骆驼核心优化

apache.camel希望一切都很好&#xff0c;您可以安全进入2020年。 Camel团队已经在忙于开发下一个Camel 3.1版本。 目标之一是继续优化骆驼核心&#xff0c;这一次我们花了一些时间来寻找路由引擎中的一些热点。 我们所研究的方面之一也是在Camel路由的每个消息中发生的对象分…

xp系统的计算机管理中用户在哪里,WINDOWSXP的用户管理和系统安全设置

台计算机)⑤回到“添加独立管理单元”对话框&#xff0c;单击“关闭”&#xff0c;回到““控制台->添加/删除管理单元”对话框&#xff0c;再单击“确定”&#xff1b;⑥此时&#xff0c;在控制台窗口左窗格中看到新添加的控制单元“本地计算机策略”&#xff1b;⑦依次展开…

XML——StAX Streaming API for XML(read+write)

【0】README 0.1&#xff09; reshipping from http://www.journaldev.com/1191/how-to-read-xml-file-in-java-using-java-stax-api http://www.journaldev.com/892/how-to-write-xml-file-in-java-using-java-stax-api 0.2&#xff09; for all source code , please visi…

Class的getInterfaces与getGenericInterface区别

一、getInterfaces 返回直接实现的接口&#xff08; 由于编译擦除&#xff0c;没有显示泛型参数&#xff09; Class<?>[] getInterfaces() 确定此对象所表示的类或接口实现的接口。 确定此对象所表示的类或接口实现的接口。 如果此对象表示一个类&am…

maven配置junit5_JUnit 5和Selenium –改善项目配置

maven配置junit5Selenium是一组支持浏览器自动化的工具和库&#xff0c;主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver&#xff0c;它提供客户端库&#xff0c;JSON有线协议&#xff08;与浏览器驱动程序进行通信的协议&#xff09;和浏览器驱动程序。 Se…

形容计算机网络教室的成语,形容教育的成语

形容教育的成语形容教育的成语【不教而杀】 【弦歌之声】 【化及冥顽】 【蒙以养正】【不言之教】 【沂水春风】 【嘉言善状】 【神道设教】【不教之教】 【相夫教子】 【画荻教子】 【磨昏抉聩】【东风化雨】 【因材施教】 【教无常师】 【脱骨换胎】…

Class的 getSuperclass与getGenericSuperclass区别

Class的getInterfaces与getGenericInterface区别 http://www.cnblogs.com/maokun/p/6773076.html一、getSuperclass 返回直接继承的父类&#xff08;由于编译擦除&#xff0c;没有显示泛型参数&#xff09; Class<? super T>getSuperclass() 返回表示此 Cla…