如何在Excel中使用正则表达式并利用Excel强大的网格设置进行数据操作?
-
单元格函数返回字符串中匹配的模式或替换值 .
-
Sub循环遍历一列数据并提取匹配到相邻单元格 .
-
需要什么设置?
-
正则表达式的Excel特殊字符是什么?
我理解正则表达式在许多情况下并不理想(To use or not to use regular expressions?),因为excel可以使用 Left
, Mid
, Right
, Instr
类型命令进行类似的操作 .
6 回答
要直接在Excel公式中使用正则表达式,以下UDF(用户定义的函数)可能会有所帮助 . 它或多或少直接将正则表达式功能公开为excel函数 .
它是如何工作的
它需要2-3个参数 .
要使用正则表达式的文本 .
正则表达式 .
指定结果外观的格式字符串 . 它可以包含
$0
,$1
,$2
等 .$0
是整个匹配,$1
和up对应于正则表达式中的相应匹配组 . 默认为$0
.一些例子
提取电子邮件地址:
结果:
some@email.com
提取几个子串:
结果:
E-Mail: some@email.com, Name: Peter Gordon
将单个单元格中的组合字符串拆分为多个单元格中的组件:
结果:
Peter Gordon
some@email.com
...如何使用
要使用此UDF,请执行以下操作(大致基于this Microsoft page . 它们有一些很好的附加信息!):
在启用宏的文件('.xlsm')中的Excel中,按
ALT+F11
打开Microsoft Visual Basic for Applications编辑器 .添加对正则表达式库的VBA引用(从Portland Runners++ answer无耻地复制):
点击工具 - >参考文献(请原谅德语截图)
在列表中找到Microsoft VBScript Regular Expressions 5.5并勾选旁边的复选框 .
单击“确定” .
单击“插入模块” . 如果为模块指定了不同的名称,请确保模块与下面的UDF名称不同(例如,命名模块
Regex
,函数regex
会导致#NAME!错误) .这是一个
regex_subst()
函数 . 例子:这是简化的代码(无论如何,对我来说简单) . 我无法弄清楚如何构建一个合适的输出模式使用上面的工作像我的例子:
我需要将它用作单元格函数(如
SUM
或VLOOKUP
)并发现它很容易:确保您位于启用宏的Excel文件中(另存为xlsm) .
打开开发人员工具Alt F11
与其他答案一样,添加Microsoft VBScript正则表达式5.5
在工作簿或其自己的模块中创建以下函数:
=REGPLACE(B1, "(\w) (\d+)", "$1$2")
(例如:"A 243"至"A243")Regular expressions用于模式匹配 .
要在Excel中使用,请执行以下步骤:
Step 1 :将VBA引用添加到"Microsoft VBScript Regular Expressions 5.5"
选择"Developer"标签(I don't have this tab what do I do?)
从'Code'功能区部分选择"Visual Basic"图标
在"Microsoft Visual Basic for Applications"窗口中从顶部菜单中选择"Tools" .
选择"References"
选中"Microsoft VBScript Regular Expressions 5.5"旁边的框以包含在工作簿中 .
点击"OK"
Step 2 :定义您的模式
基本定义:
-
范围 .例如
a-z
匹配a到z的小写字母例如
0-5
匹配0到5之间的任何数字[]
恰好匹配这些括号内的一个对象 .例如
[a]
匹配字母a例如
[abc]
匹配单个字母,可以是a,b或c例如
[a-z]
匹配字母表中的任何单个小写字母 .()
为返回目的分组不同的匹配项 . 见下面的例子 .{}
用于在其之前定义的模式的重复副本的乘数 .例如
[a]{2}
匹配两个连续的小写字母a:aa
例如
[a]{1,3}
匹配至少一个和最多三个小写字母a
,aa
,aaa
+
匹配之前定义的模式中的至少一个或多个 .a+
将匹配连续的a
,aa
,aaa
,依此类推?
匹配前面定义的零或一个模式 .例如模式可能存在也可能不存在,但只能匹配一次 .
例如
[a-z]?
匹配空字符串或任何单个小写字母 .*
匹配之前定义的模式的零个或多个 . - 例如可能存在或不存在的模式的通配符 . - 例如[a-z]*
匹配空字符串或字符串小写字母 ..
匹配除换行符之外的任何字符\n
a.
匹配以a开头并以\n
以外的任何内容结尾的双字符串|
OR运算符例如
a|b
表示可以匹配a
或b
.例如
red|white|orange
恰好匹配其中一种颜色 .^
NOT运算符例如
[^0-9]
字符不能包含数字例如
[^aA]
字符不能是小写a
或大写A
\
转义后面的特殊字符(覆盖上述行为)\.
,014343,\(
,\?
,\$
,\^
锚定模式:
^
匹配必须在字符串的开头发生例如
^a
第一个字符必须是小写字母a
例如
^[0-9]
第一个字符必须是数字 .$
匹配必须发生在字符串的末尾a$
最后一个字符必须是小写字母a
优先表:
预定义字符缩写:
Example 1 :以宏的形式运行
以下示例宏查看单元格
A1
中的值,以查看前1个或2个字符是否为数字 . 如果是这样,它们将被删除,并显示其余的字符串 . 如果没有,则会出现一个框,告诉您没有找到匹配项 .12abc
的单元格A1
将返回abc
,1abc
的值将返回abc
,abc123
的值将返回"Not Matched",因为数字不在字符串的开头 .Example 2 :作为单元格函数运行
此示例与示例1相同,但设置为作为单元内函数运行 . 要使用,请将代码更改为:
将字符串("12abc")放在单元格
A1
中 . 在单元格B1
中输入此公式=simpleCellRegex(A1)
,结果将为"abc" .Example 3 :循环范围
此示例与示例1相同,但循环遍历一系列单元格 .
Example 4 :拆分不同的模式
此示例循环一个范围(
A1
,A2
&A3
),并查找以三位数字开头的字符串,后跟单个字母字符,然后是4位数字 . 输出通过使用()
将模式匹配拆分为相邻单元 .$1
表示第一组()
中匹配的第一个模式 .结果:
Additional Pattern Examples
这是我的尝试:
为那些匆忙的人扩展patszim的answer .
打开Excel工作簿 .
Alt F11打开VBA / Macros窗口 .
在 Tools 下添加对正则表达式的引用然后 References
并选择 Microsoft VBScript Regular Expression 5.5
插入一个新模块(代码需要驻留在模块中,否则它不起作用) .
在新插入的模块中,
添加以下代码:
如果需要在不同的工作簿中使用它,请将该函数存储在 Personal.XLSB 中