Table of contents
总是不能理解为什么正则表达式在Excel公式中不被支持? 现在,它们被支持了:)通过我们的自定义函数,你可以轻松地找到、替换、提取和删除与特定模式匹配的字符串。
乍一看,Excel拥有你所需要的一切文本字符串操作。 嗯......那么正则表达式呢? 哎呀,Excel中没有内置的Regex函数。 但没有人说我们不能创建自己的函数:)
什么是正则表达式?
一个正则表达式(又称 反义词 或 反义词 )是一个特殊编码的字符序列,它定义了一个搜索模式。 使用该模式,你可以在一个字符串中找到匹配的字符组合或验证数据输入。 如果你熟悉通配符符号,你可以把regexes看作通配符的高级版本。
正则表达式有自己的语法,由特殊字符、运算符和结构体组成。 例如,[0-5]匹配从0到5的任何单一数字。
正则表达式在许多编程语言中都有使用,包括 JavaScript 和 VBA。 后者有一个特殊的 RegExp 对象,我们将利用它来创建我们的自定义函数。
Excel是否支持REGEX?
遗憾的是,Excel中没有内置的Regex函数。 为了能够在你的公式中使用正则表达式,你必须创建你自己的用户定义的函数(基于VBA或.NET)或安装支持正则表达式的第三方工具。
Excel Regex小抄
无论一个正则表达式是非常简单的还是极其复杂的,它都是使用常见的语法构建的。 本教程的目的不是教你正则表达式。 对于这一点,网上有很多资源,从针对初学者的免费教程到针对高级用户的高级课程。
下面我们提供了一个主要RegEx模式的快速参考,这将帮助你掌握基础知识。 它也可以作为你学习进一步的例子时的小抄。
如果你对正则表达式很熟悉,你可以直接跳到正则函数。
角色
这些是最经常使用的模式,用于匹配某些字符。
样式 | 描述 | 例子 | 匹配度 |
. | 通配符:匹配除换行符外的任何单个字符 | .ot | 点 , 热的 , 锅 , @ot |
\d | 数字字符:从0到9的任何单一数字 | \d | 在 a1b , 匹配 1 |
\D | 任何非数字的字符 | \D | 在 a1b , 匹配 a 和 b |
\s | 空白字符:空格、制表符、换行符和回车符 | .\s. | 在 3分钱 , 匹配 3 c |
\S | 任何非空白字符 | \S+ | 在 30美分 , 匹配 30 和 分数 |
\w | 字符:任何ASCII字母、数字或下划线 | \w+ | 在 5_cats**** , 匹配 5_cats |
\W | 任何非字母数字字符或下划线的字符 | \W+ | 在 5_cats**** , 匹配 *** |
\t | 标签 | ||
\n | 新线 | \n\d+ | 在下面的两行字符串中,匹配10 5只猫 10只狗 |
\ | 逃避一个字符的特殊含义,所以你可以搜索它 | \. \w+\. | 转移一个句号,这样你就可以在一个字符串中找到字面的". "字符。 先生。 , 夫人。 , 教授。 |
角色类
使用这些模式,你可以匹配不同字符集的元素。
样式 | 描述 | 例子 | 匹配度 |
[人物] | 匹配括号内的任何单个字符 | d[ooi]g | 犬 和 挖掘 |
[^字符] | 匹配任何不在括号内的单一字符 | d[^oi]g | 匹配度 dag, dug , d1g 不匹配 犬 和 挖掘 |
[从到] | 匹配括号内的任何字符。 | [0-9] [a-z] [A-Z] | 从0到9的任何一个数字 任何单一的小写字母 任何一个大写字母 |
量词
量词是一种特殊的表达式,指定要匹配的字符数量。 量词总是适用于它前面的字符。
样式 | 描述 | 例子 | 匹配度 |
零或更多的发生率 | 1a* | 1, 1a , 1aa, 1aaa ,等等。 | |
+ | 一次或多次发生 | po+ | 在 锅 , 匹配 po 在 穷人 , 匹配 便便 |
? | 零次或一次发生 | 萝拉 | 道路,杆子 |
*? | 零或更多的发生率,但尽可能少的发生率 | 1a*? | 在 1a , 1aa 和 1aaa , 匹配 1a |
+? | 出现一次或多次,但尽可能少。 | po+? | 在 锅 和 穷人 , 匹配 po |
?? | 零次或一次出现,但尽可能少。 | 罗阿? | 在 道路 和 杆件 , 匹配 巡回演出 |
{n} | 与前面的模式匹配n次 | \d{3} | 正好是3位数 |
{n,} | 与前面的模式匹配n次或更多次 | \d{3,} | 3位或更多数字 |
{n,m} | 匹配前述模式的n到m次。 | \d{3,5} | 从3位到5位 |
分组
分组结构是用来从源字符串中捕获一个子串,这样你就可以对它进行一些操作。
语法 | 描述 | 例子 | 匹配度 |
(模式) | 捕获组:捕获一个匹配的子串并为其分配一个序号 | (\d+) | 在 5只猫和10只狗 , 捕获 5 (第1组)和 10 (第2组) |
(?:模式) | 非捕获组:匹配一个组但不捕获它 | (d+)(?: 狗) | 在 5只猫和10只狗 , 捕获 10 |
\1 | 第1组的内容 | (\d+)\+(\d+)=\2\+1 | 匹配5+10=10+5 并捕捉到 5 和 10 ,这是在捕捉组 |
\2 | 第2组的内容 |
锚点
锚点指定了在输入字符串中寻找匹配的位置。
锚地 | 描述 | 例子 | 匹配度 |
^ | 字符串的开始 注:[^括号内]表示 "不" | ^\d+ | 字符串开头的任何数字。 在 5只猫和10只狗 , 匹配 5 |
$ | 字符串结束 | \d+$ | 字符串末尾的任何数字。 在 10加5等于15 , 匹配 15 |
\b | 单词边界 | \bjoy\b | 匹配度 快乐 作为一个单独的词,但不是在 令人愉快的 . |
\B | 不是一个词的边界 | \Bjoy\B | 匹配度 快乐 在 令人愉快的 ,但不是作为一个单独的词。 |
交替(OR)结构
交替操作数启用了OR逻辑,所以你可以匹配这个或那个元素。
构建 | 描述 | 例子 | 匹配度 |
匹配任何由竖条分隔的单一元素 | (s | 在 她卖的是海贝壳。 匹配 销售 和 贝壳 |
环顾四周
当你想匹配后面或前面没有别的东西的时候,环视结构很有帮助。 这些表达式有时被称为 "零宽度断言 "或 "零宽度匹配",因为它们匹配的是一个位置而不是实际的字符。
注意:在VBA的RegEx风味中,不支持lookbehinds。
样式 | 描述 | 例子 | 匹配度 |
(?=) | 积极的展望 | X(?=Y) | 当表达式X后面有Y时与之匹配(即如果X前面有Y)。 |
(?!) | 负向展望 | X(?!Y) | 如果表达式X后面没有Y,则与之匹配。 |
(?<=) | 正面看后边 | (?<=Y)X | 当表达式X前面有Y时,与之匹配(即如果X后面有Y)。 |
(? )</td | 负面评价的背后 | (? Y)X</td | 当表达式X的前面没有Y时,与之匹配。 |
现在你知道了这些要点,让我们进入最有趣的部分--在真实数据上使用正则表达式来解析字符串并找到所需的信息。 如果你需要关于语法的更多细节,微软的正则表达式语言指南可能会有帮助。
为Excel定制的RegEx函数
如前所述,Microsoft Excel没有内置的RegEx函数。 为了启用正则表达式,我们创建了三个自定义的VBA函数(又称用户定义的函数)。 你可以从下面链接的页面或我们的样本工作簿中复制代码,然后粘贴到你自己的Excel文件中。
VBA正则函数如何工作
本节解释了内部机制,对于那些想知道后端到底发生了什么的人来说,可能会感兴趣。
要在VBA中开始使用正则表达式,你需要激活RegEx对象引用库或使用CreateObject函数。 为了省去你在VBA编辑器中设置引用的麻烦,我们选择后一种方法。
正则对象有4个属性。
- 样式 - 是指 模式 来匹配输入的字符串。
- 全球 - 在我们的函数中,它被设置为True,以获得 所有比赛 .
- MultiLine - 在我们的代码中,它被设置为 "True",以便在多行字符串中跨行匹配模式,还是只在第一行匹配。 在每一行中 .
- 忽略案例 - 定义了正则表达式是区分大小写的(默认)还是不区分大小写的(设置为True)。 在我们的例子中,这取决于你如何配置可选的 match_case 在默认情况下,所有函数都是 区分大小写 .
VBA正则的限制
Excel VBA实现了基本的勒索模式,但它缺乏许多在.NET、Perl、Java和其他勒索引擎中可用的高级功能。 例如,VBA RegExp不支持内联修改器,如(?i)用于大小写不敏感的匹配,或(?m)用于多行模式,lookbehinds,POSIX类,仅举几例。
Excel Regex匹配功能
ǞǞǞ 正则匹配 函数在输入字符串中搜索与正则表达式相匹配的文本,如果找到匹配的文本则返回 TRUE,否则返回 FALSE。
正则匹配(text, pattern, [match_case])。在哪里?
- 文本 (required) - 一个或多个要搜索的字符串。
- 样式 (required) - 要匹配的正则表达式。
- Match_case (可选) - 匹配类型。 TRUE或省略 - 大小写敏感;FALSE - 大小写不敏感
该函数的代码在这里。
示例:如何使用正则表达式来匹配字符串
在下面的数据集中,假设你想识别含有SKU代码的条目。
鉴于每个SKU以2个大写字母开头,后面是连字符,然后是4个数字,你可以用下面的表达式来匹配它们。
样式 : b[A-Z]{2}-d{4}\b
其中[A-Z]{2}表示从A到Z的任何2个大写字母,\d{4}表示从0到9的任何4个数字。 字的边界\b表示一个SKU是一个独立的字,而不是一个更大的字符串的一部分。
建立好模式后,像平时一样开始输入公式,函数的名字就会出现在Excel的自动补全功能所建议的列表中。
假设原始字符串在A5中,公式如下。
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
为方便起见,你可以在一个单独的单元格中输入正则表达式,并使用绝对引用($A$2)作为 模式 这确保了当你将公式复制到其他单元格时,单元格地址将保持不变。
=RegExpMatch(A5, $A$2)
要显示你自己的文本标签,而不是TRUE和FALSE,可以在IF函数中嵌套RegExpMatch,并在下面指定所需文本 value_if_true 和 value_if_false 争论。
=IF(RegExpMatch(A5, $A$2), "是", "否")
更多公式实例,请参见。
- 如何使用正则表达式来匹配字符串
- 用重合词验证Excel数据
Excel Regex提取功能
ǞǞǞ 正则Extract 函数搜索与正则表达式相匹配的子字符串,并提取所有匹配或特定匹配。
正则Extract(text, pattern, [instance_num], [match_case])在哪里?
- 文本 (required) - 要搜索的文本字符串。
- 样式 (required) - 要匹配的正则表达式。
- Instance_num (可选) - 一个序列号,表示要提取的实例。 如果省略,则返回所有找到的匹配数据(默认)。
- Match_case (可选) - 定义是否匹配(TRUE或省略)或忽略(FALSE)文本大小写。
你可以在这里获得该函数的代码。
示例:如何使用正则表达式提取字符串
在我们的例子中,让我们进一步提取发票号码。 为此,我们将使用一个非常简单的重码,匹配任何7位数的号码。
样式 :: \b\d{7}\b
把图案放在A2中,你就可以通过这个紧凑而优雅的配方完成工作。
=RegExpExtract(A5, $A$2)
如果匹配了一个模式,该公式就会提取一个发票号码,如果没有找到匹配,则不返回任何东西。
更多的例子,请看:如何在Excel中使用regex提取字符串。
Excel Regex 替换功能
ǞǞǞ 正则替换 函数用你指定的文本来替换与regex匹配的值。
RegExpReplace(text, pattern, replacement, [instance_num], [match_case])在哪里?
- 文本 (required) - 要搜索的文本字符串。
- 样式 (required) - 要匹配的正则表达式。
- 替换 (required) - 替换匹配子字符串的文本。
- Instance_num (可选) - 要替换的实例,默认为 "所有匹配"。
- Match_case (可选) - 控制是否匹配(TRUE或省略)或忽略(FALSE)文本大小写。
该函数的代码可在此获得。
例子:如何使用重组词替换或删除字符串
我们的一些记录包含信用卡号码。 这些信息是保密的,你可能想用其他东西代替它,或者完全删除。 这两项任务都可以在以下工具的帮助下完成 正则替换 在第二种情况下,我们将用一个空字符串进行替换。
在我们的样本表中,所有的卡号都有16位数字,它们被写成4组,用空格隔开。 为了找到它们,我们用这个正则表达式复制模式。
样式 : \b\d{4} \d{4} \d{4} \b
替换时,使用以下字符串。
替换 : xxxx xxxx xxxx xxxx
而这里有一个完整的公式,以 替换 信用卡号码与不敏感的信息。
=RegExpReplace(A5, "\b\d{4} \d{4} \d{4} \d{4}b", "XXXXXXXXXXXX")
在不同的单元格(A2和B2)中设置了反语法和替换文本,该公式同样能正常工作。
在Excel中,"删除 "是 "替换 "的一种特殊情况。 为了 移除 信用卡号码,只需使用一个空字符串("")作为 替换 争论。
=RegExpReplace(A5, "\b\d{4} \d{4} \d{4} \d{4}b", "" )
提示:要想在结果中得到空行,可以使用另一个RegExpReplace函数,如本例所示:如何使用regex删除空行。
欲了解更多信息,请参见。
- 如何在Excel中使用regex替换字符串
- 如何使用regex删除字符串
- 如何使用重构函数剥离空白点
匹配、提取、替换和删除子字符串的Regex工具
我们的终极套件的用户无需在他们的工作簿中插入一行代码就可以获得正则表达式的所有功能。 所有必要的代码都由我们的开发人员编写,并在安装过程中顺利地集成到你的Excel中。
与上面讨论的VBA函数不同,Ultimate Suite的函数是基于.NET的,这有两个主要优点。
- 你可以在普通的.xlsx工作簿中使用正则表达式,而不需要添加任何VBA代码,也不需要将其保存为支持宏的文件。
- .NET Regex引擎支持全功能的经典正则表达式,这让你可以构建更复杂的模式。
如何在Excel中使用Regex
安装了Ultimate Suite后,在Excel中使用正则表达式就像这两个步骤一样简单。
- 关于 阿博比特数据 选项卡,在 文本 组,点击 Regex工具 .
- 关于 Regex工具 窗格,执行以下操作。
- 选择源数据。
- 输入你的重码模式。
- 选择所需的选项。 匹配 , 萃取物 , 移除 或 替换 .
- 要获得公式而不是数值的结果,选择 作为一个公式插入 复选框。
- 按下行动按钮。
例如,为了从A2:A6单元格中删除信用卡号码,我们配置了这些设置。
三下五除二,一个AblebitsRegex函数就会被插入到你的原始数据右边的新列中。 在我们的例子中,公式是:。
=AblebitsRegexRemove(A2, "\b\d{4} \d{4} \d{4} \b" )
一旦公式出现,你可以像任何本地公式一样编辑、复制或移动它。
如何在单元格中直接插入一个Regex公式
AblebitsRegex函数也可以直接插入到单元格中,而不需要使用插件的界面。 下面是方法。
- 点击 fx 按钮,或在公式栏上的 插入功能 关于 公式 标签。
- 在 插入功能 对话框,选择 AblebitsUDFs 类别,选择感兴趣的功能,然后点击确定。
- 像你平时那样定义函数的参数,然后点击确定。 完成!
欲了解更多信息,请参见Excel的Regex工具。
这就是如何使用正则表达式来匹配、提取、替换和删除Excel单元格中的文本。 我感谢你的阅读,并期待下周在我们的博客上见到你
可用的下载
Excel Regex - 公式实例 (.xlsm 文件)
终极套房 - 试用版 (.exe文件)