返回公众号历史文章目录

文章 / 公众号历史文章

[好文重发]Excel催化剂功能第39波-DotNet版的正则处理函数

在笔者手中最高频使用的自定义函数,正则表达式不应该只是程序员去学习掌握,日常做数据相关的工作,永远绕不开的话题就是字符串的处理,如果不掌握些正则表达式,实在太可惜,各种问题无穷无尽,也不可能单靠一些简单技巧来解决。 有正则表达式,并且可以在Excel环境下使用,将给大家赋能,从此是我掌管字符串,而非

在笔者手中最高频使用的自定义函数,正则表达式不应该只是程序员去学习掌握,日常做数据相关的工作,永远绕不开的话题就是字符串的处理,如果不掌握些正则表达式,实在太可惜,各种问题无穷无尽,也不可能单靠一些简单技巧来解决。

有正则表达式,并且可以在Excel环境下使用,将给大家赋能,从此是我掌管字符串,而非补字符串所虐。想要提取、替换什么,都变得无比轻松。

原文导读

在很久之前已经开发过的一些自定义函数,未能有详细的讲解,接下来几波中着重对之前开发过的自定义函数进行详细讲解及示例说明,希望能够帮助到普通用户们能顺利使用,此篇介绍为正则表达式函数。

若需要简单的字符串处理,也可以用封装好的一些简单功能,如下文:

Excel催化剂功能第43波-文本处理类函数增强

Excel催化剂功能第25波-小白适用的文本处理功能

学习和使用Excel催化剂最佳方式

因Excel催化剂功能非常大,是大型的综合性插件,若需要使用其中的某个功能,特别是不常用到的功能,强烈推荐使用搜索+笔记的方式完成。

搜索可到公众号搜索关键词,或下载离线的pdf或docx版本的功能合集文件(后台回复【合集】即可获得下载链接)。

搜索+笔记的使用方法论,可参阅下文。

Excel催化剂功能第113波-将帮助文档的主动权归还用户手中

为何要使用正则表达式

正则表达式在字符串处理中,是一大利器,从复杂的杂乱的字符串内容中,提取出有用的符合要求的信息,仅使用Excel自带的文本处理函数如LEFT/RIGHT/MID/SUBSTITUTE等,明显力不从心。

正则表达式在各种主流的编程语言中都有支持,语法较为相近,学习成本也不算太高,现把正则表达式在Excel的自定义函数中得以实现,可以极大地方便了广大用户在Excel环境中作字符串的提取工作。相对其他非Excel环境来说,只是简单的一个自定义函数即可调用,无需找各种编程环境来实现,实用性方面还是很强。

DotNet版的正则表达式和VBA版有何不同?

VBA是微软已经停止更新的语言,在正则表达式的功能上支持有限(但也基本够用)。在DotNet版的正则表达式中,支持的功能更多。如支持使用Split分割、零宽度先行断言、零宽度后发断言、可命名组等。

详细的正则表达式教程可自行百度或查看微软官方的文档
https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/regular-expressions?view=netframework-4.7.2

自定义函数介绍

在Excel版正则自定义函数中,大概有以下的一些参数需要输入,看起来很多,但其实有相当部分是可以使用默认参数可省略输入的。

  • input=输入
  • pattern=匹配规则
  • matchNum=确定第几个匹配返回值,索引号从0开始,第1个匹配,传入0
  • groupNum=确定第几组匹配,索引号从1开始,0为返回上层的match内容。
  • returnNum,返回split数组中的第几个元素,索引从0开始
  • isCompiled=是否编译,是为1,否为0,暂时没有测试过哪个快在数据量大时,文档好像说数据量大用编译比较好
  • isECMAScript,用来指定\w是否匹配一些特殊编码之类的例如中文,当false时会匹配中文,指定为true时,可能和其他的指定有些冲突。
  • RegexOptions.ECMAScript 选项只能与 RegexOptions.IgnoreCase 和 RegexOptions.Multiline 选项结合使用。在正则表达式中使用其他选项会导致 ArgumentOutOfRangeException。
  • isRightToLeft,从右往左匹配。

正则表达式,最复杂的部分是pattern的匹配规则,其他的都较好理解。
因Excel参数输入过多不太友好,在【正则表达式选项】的设定上使用DotNet的可在Pattern里设定内联字符的方式输入,即部分正则表达式选项的控制,落在pattern匹配规则上输入。
如pattern= (?i)[a-z]中的(?i)是忽略大小写的意思,且为全局性忽略。
而pattern=abc(?i)[a-z]时,为局部忽略大小写,前面的abc是不忽略大小写的匹配。

公众号文章插图

正则表达式选项表

具体可参照官方文档:
https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/regular-expression-options?view=netframework-4.7.2

具体函数实现

针对正则函数的匹配、替换、分割等作了一系列的自定义函数实现,具体可参照示例文件来作进一步的理解。可到QQ群文件里下载示例文件。

公众号文章插图

正则函数的函数分类位置

RegexIsMatch函数

后面3个参数一般仅需要FALSE或省略输入。

公众号文章插图

RegexIsMatch函数用法示例

RegexMatch函数

需要传入返回的是哪个索引的Match返回值,索引号从0开始。

公众号文章插图

RegexMatch函数用法示例

RegexMatchs函数

相对RegexMatch仅返回一个匹配值,此函数返回的是所有匹配值,并可控制是按列还是按行的方式返回多值

公众号文章插图

RegexMatchs

RegexMatchsFromFile函数

此函数和RegexMatchs唯一区别在于引用的input部分,此函数是传入一个文本文件的路径,读取此路径下的文本文件作为input的内容,可能部分内容不好放到单元格里引用时可以使用引函数来引用放到文本文件里的内容。

RegexMatchGroup函数

需要指定Match和Group的索引项,其中Group的索引项是从1开始。

公众号文章插图

RegexMatchGroup函数用法示例

RegexMatchGroups函数

同样的,返回指定索引Match下的所有Group值时,无需指定Group的索引,返回的是所有的Group值

公众号文章插图

RegexMatchGroups函数用法示例

RegexMatchGroupsFromFile函数

同理,此函数是第1参数input是由文本文件的路径组成。调用文本文件的内容作为input参数的内容。

RegexReplace函数

把匹配到的内容替换成其他内容,相对上述的Match或Group是提取匹配到的内容,此时是替换了匹配的内容。

公众号文章插图

RegexReplace函数用法示例

RegexSplit函数

此处的pattern是用于把原input字符串作分割使用。通过指定returnNum来返回指定索引的结果值。

公众号文章插图

RegexSplit函数用法示例

RegexSplit函数

同理,相对RegexSplit返回指定索引值,此函数返回的是所有结果值。

公众号文章插图

RegexSplits函数用法示例

总结

正则表达式用于处理字符串无疑是强大无比的,通过pattern和RegexOptions的控制,可以变化出无数的规则用于匹配特定内容,在Excel的环境下,可以通过自定义函数的调用方便来使用正则表达式,对日常数据处理来说将带来无穷的便利。

普通非编程人员可以简单了解下正则表达式的基础知识,即可上手使用,还是非常值得投资一些时间来学习正则表达式的。