Coding Spirit

一位程序员,比较帅的那种

0%

常用的Regex

当进行数据分析时,我们常使用正则表达式爬取字符串得到目标数据。(有点爬虫的感觉)

目标数据为单行的情况

最简单的情况,字符串可能是这样的:
!@#$%[mark1]data[mark2]!@#$%
!@#$%[mark1]data[mark2]!@#$%

其中“!@#$%”为一大段不关心的字符,[mark1]和[mark2]为特定字符用于标记数据。我们的目标是将这个data得到。
以源字符串、[mark1]和[mark2]分别为srcData、”#”、”!”为例,可以这样匹配:

1
string value = Regex.Match(srcData, "(?<=#).*?(?=!)").Value;

此段代码将对#和!之间的除\n之外的字符进行非贪婪匹配。
注意,由于使用了通配符”.”,如果目标数据是多行,该正则表达式将不能正确匹配。

目标数据为多行

前段时间的一个项目中要求从.c文件中获得某一struct的全部成员变量,一般而言struct内部都是多行的,因此上一种方式无法正确匹配。

1
string value = Regex.Match(srcData, @"(?<=[START])[\s\S]+?(?=[END])").Value;

这种方式就比较粗暴了,直接非贪婪匹配所有字符(非空格和空格字符),所以得到的数据通常包括\r\n。