在利用正则表达式的解析过程中,我们经常会遇到多行字符输出的情形,例如执行执行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(?:可用)?字节");

利用多行匹配,可以提升正则表达式的解析效率与适用范围,尤其要关注启用多行模式后的差异性。

日志收集的时候多日志一直是一个比较头疼的问题,开发人员并不愿意将日志以 JSON 的方式进输出,那么就只能在收集日志的时候去重新对日志做下结构化了。由于日志采集器的实现方式和标准不一样,所以具体如何处理多日志不同的采集器也会不一样的,比如这里我们使用 Fluentd 来作为日志采集器,那么我们就可以使用 这个解析器来处理多日志。多解析器使用 和 参数解析日志, 用于检测多日志的起始。,其中 N 的范围是 ,是多日志的 格式列表。比如现在我们有如下所示的多日志数据: 首先创建一个 Matcher类提供了多个方法来进匹配操作,例如find()方法用于查找下一个匹配项,group()方法用于获取匹配项的字符串表示。在上面的代码中,我们使用find()方法查找输入字符串中的下一个匹配项,并使用group()方法获取匹配项的字符串表示。replaceFirst()方法会替换第一个匹配项,而replaceAll()方法会替换所有匹配项。在上面的代码中,我们使用replaceFirst()方法将第一个匹配项替换为指定的字符串,并使用replaceAll()方法将所有匹配项替换为指定的字符串。 grep是Linux中用于文本处理的最有用和功能最强大的命令之一。 grep在一个或多个输入文件中搜索与正则表达式匹配,并将每条匹配写入标准输出。在本文中,我们将探讨在grep的GNU版本中如何使用正则表达式的基础,大多数Linux操作系统默认情况下都提供此功能。Grep正则表达式正则表达式正则表达式是与一组字符串匹配的模式。模式由运算符,构造文字字符和元字符组成,它们具有特殊的含义。 ... Codec 是 logstash 从 1.3.0 版开始新引入的概念(Codec来自Coder/decoder 两个单词的首字母缩写)。在此之前,logstash 只支持纯文本形式输入,然后以过滤器处理它。但现在,我们可以在输入期处理不同类型的数据,这全是因为有了 codec 设置。所以,这里需要纠正之前的一个概念。Logstash 不只是一个input | filter | output... 正则表达式基础知识请参阅《正则表达式基础知识》,本文使用正则表达式匹配日志并从中解析出相应的信息。假设现在有这样的SQL日志:SELECT * FROM open_app WHERE 1 and `client_id` = 'a08f5e32909cc9418f' and `is_valid` = '1' order by id desc limit 32700,100;# Time: 16... 理解得到的题目:跨匹配(将整篇文章当作一个长字符串),将cat和dog之间的,最长的,内容提取出来,且其中不包含high和low。实现代码(一perl解决):perl -pe ' s:\n::g; s:(high|low):\n$1:;' txt1.bak | perl -ne 'print $1."\n" if /cat(.*)dog/' >success结果保存在success文件中... Pattern.compile("'.*?'", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 转载于:https://www.cnblogs.com/ghostr/p/9888664.html 多文本文件转列表解析成字典方法,多字典#文本内容 Rain 80000\n Egon 50000\n Yuan 30000\nsalary = open("salaryinfo.txt", "r+", encoding="UTF-8")salary_list = [] #定义一个新的列表值。for line in salary.readlines():salary_list.append... 展开全部importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FilenameFilter;importjava.io.IOException;importjava.io.InputS... 需求针对tab键带来的多个空格问题,有时候我们针对带空格的一数据要进切割,如果有多个空格就会出现就会切割空格出现,我们想把空格都去掉,所以需要用到某些方法。解决方案利用正则表达式匹配空格\\s+首先利用split(“\\s+”);方法来对字符串切割,尽可能的匹配空格,这里也挺有意思,因为空格数目不一样,可以动态变换匹配的空格数量,这个实现原理可以看看底层原理,挺有意思。