JAVA总结(五):多行匹配正则表达式的两种解析方法
来源:互联网 发布:淘宝上叔家护肤品怎样 编辑:程序博客网 时间:2024/05/23 10:22
在利用正则表达式的解析过程中,我们经常会遇到多行字符输出的情形,例如执行执行dir命令,如输出如下结果:
1 个文件 59,629,625 字节7 个目录 41,259,528,192 可用字节
针对这样的输出结果,我们有解析方法:
1. 将整个输出结果作为一个正则表达式解析;
2. 在输出结果中按每行依次进行解析;
方法一:跨行解析
对于跨行解析,首先需要解决的问题是如何匹配换行符,在大部分的应用场景下,可利用“\s”轻松解决问题,但如果要利用“.”匹配换行符,这时候就需要使用DOTALL模式,如下:
// 里面带有换行符String testTxt = "1 个文件 59,629,625 字节\r\n7 个目录 41,259,528,192 可用字节";// (?s)与DOTALL模式相等Pattern pat = Pattern.compile("(?s)^(\\d+)\\s个文件\\s+([0-9,]+)\\s+字节\\s(.*)$");// 判断正则表达式是否匹配if(mat.matches()) { System.out.print(mat.group(2)); System.out.print(mat.group(3));}
在上面的例子中,我们发现“\r\n”会被当作两个字符,所以必须要使用“\s+”进行匹配,否则将会被划归到“(.*)”分组中。
此外,上面的例子也说明正则表达式可以匹配多行字符,需要注意的是,此时并不需要启用多行模式(“(?m)”或MULTILINE)。
方法二:逐行匹配
在此种模式下,我们必须要启动多行模式,这样^和$字符不仅能匹配输入序列的开始(据我多次测试,好像并不能匹配开始,待进一步证明)与结束,还能匹配每行的开始与结束,如下:
// 请注意起头的\n字符String testTxt = "\n1 个文件 59,629,625 字节\r\n7 个目录 41,259,528,192 可用字节";// (?m)代表启动多行模式Pattern pat = Pattern.compile("(?m)^(\\d+)\\s个(?:文件|目录)\\s+([0-9,]+)\\s(?:可用)?字节$"); Matcher mat = pat.matcher(testTxt);// 提取文件数量与字节数量while(mat.find()) { System.out.println(mat.group(1)); System.out.println(mat.group(2));}
在上面的例子中,正则表达式将会寻找输入序列的每行开始与结束,然后依次进行匹配,如果并不需要特别关注每行的开始与结束,可以去掉^、$标识符,依旧能够顺利匹配,如下:
Pattern pat = Pattern.compile("(\\d+)\\s个(?:文件|目录)\\s+([0-9,]+)\\s(?:可用)?字节");
结论
利用多行匹配,可以提升正则表达式的解析效率与适用范围,尤其要关注启用多行模式后的差异性。
阅读全文
0 0
- JAVA总结(五):多行匹配正则表达式的两种解析方法
- 两种正则表达式匹配E-Mail的方法
- JAVA总结(四):正则表达式匹配中文的三种方法
- JAVA总结(四):正则表达式匹配中文的三种方法
- java中解析逻辑表达式的两种方法比较
- JAVA正则表达式匹配,替换,查找,切割的总结
- java正则表达式的匹配
- Java 正则表达式的匹配
- Java正则表达式匹配多行
- JAVA中正则表达式匹配,替换,查找,切割的方法
- 匹配URL的正则表达式解析
- java正则表达式常用字段匹配方法
- 匹配多行字符的正则表达式
- java中判断字符串是否数字的两种方法(在java中用正则表达式)
- 正则表达式 匹配"<"方法!
- 常用正则表达式以及oc常用正则匹配方法总结
- 常用正则表达式以及oc常用正则匹配方法总结
- js正则表达式的几个匹配方法
- 进程间通信(二)
- [LintCode]376.二叉树的路径和
- Js实现图片轮播,以及鼠标移动选择指定图片
- 软件测试过程及其管理
- POJ.3107 Godfather (树形DP 树的重心)
- JAVA总结(五):多行匹配正则表达式的两种解析方法
- 手把手搭建一个简易的图片文件服务器
- dubbo--远程调用数据交换层服务端类图
- 最短路算法
- 【Unity3D】回合制游戏
- python KNN中使用到的函数表达式
- NYOJ题目915-+-字符串
- antd mobile(七) 固定NavBar
- 特征工程--特征离散化的意义