Table of contents
你有没有想过,如果有人能用正则表达式来丰富Excel的工具箱,那该有多强大? 我们不仅想过,而且还在努力:)现在,你可以把这个奇妙的RegEx函数添加到你自己的工作簿中,并立即擦除符合模式的子串。
上周,我们研究了如何在Excel中使用正则表达式来替换字符串。 为此,我们创建了一个自定义的Regex Replace函数。 结果发现,这个函数超出了它的主要用途,不仅可以替换字符串,还可以删除它们。 怎么会这样呢? 在Excel中,删除一个值无非是用一个空字符串来替换它,我们的Regex函数就是这样的非常善于!
VBA正则函数删除Excel中的子串
众所周知,Excel中默认不支持正则表达式。 要启用它们,你需要创建自己的用户定义函数。 好消息是,这样的函数已经写好了,经过测试,可以使用。 你所要做的就是复制这段代码,将其粘贴到你的VBA编辑器中,然后将文件保存为 支持宏的工作簿 (.xlsm)。
该函数的语法如下。
RegExpReplace(text, pattern, replacement, [instance_num], [match_case])前三个参数是必须的,后两个参数是可选的。
在哪里?
- 文本 - 要搜索的文本字符串。
- 样式 - 要搜索的正则表达式。
- 替换 - 要替换的文本。 要 删除子字符串 匹配的模式,使用一个 空字符串 ("")进行更换。
- Instance_num (可选) - 要替换的实例。 如果省略,所有找到的匹配都会被替换(默认)。
- Match_case (可选) - 一个布尔值,表示是否匹配或忽略文本大小写。 对于大小写敏感的匹配,使用TRUE(默认);对于大小写不敏感 - FALSE。
更多信息,请参见 RegExpReplace 函数。
提示:在简单的情况下,你可以用Excel公式删除单元格中的特定字符或单词。 但正则表达式为此提供了更多的选择。
如何使用正则表达式删除字符串 - 示例
如上所述,要删除与模式相匹配的文本部分,你要用一个空字符串来替换它们。 因此,一个通用的公式是这样的。
RegExpReplace(text, pattern, "", [instance_num], [match_case])下面的例子显示了这个基本概念的各种实现。
删除所有匹配或特定匹配
RegExpReplace函数被设计用来查找与给定的重词相匹配的所有子字符串。 要删除哪些出现是由第四个可选参数控制的,名为 实例_num .
默认是 "全部匹配" - 当 实例_num 参数被省略,所有找到的匹配都被删除。 要删除一个特定的匹配,请定义实例编号。
在下面的字符串中,假设你想删除第一个订单号。 所有这样的数字都以散列符号(#)开始,并且正好包含5个数字。 因此,我们可以用这个重合词来识别它们。
样式 : #d{5}b
word boundary (b)指定匹配的子串不能是一个更大的字符串的一部分,如#10000001。
要删除所有的匹配,需要 实例_num 参数未被定义。
=RegExpReplace(A5, "#d{5}\b", "")
为了只根除第一次出现的情况,我们把 实例_num 参数为1。
=RegExpReplace(A5, "#d{5}\b", "", 1)
删除某些字符的Regex
要从一个字符串中删除某些字符,只需写下所有不需要的字符,并用竖条将它们分开即可
例如,为了使以各种格式书写的电话号码标准化,首先我们要去掉一些特定的字符,如括号、连字符、点和空白处。
样式 : \(
=RegExpReplace(A5, "\(
这个操作的结果是一个10位数的数字,如 "1234567890"。
为方便起见,你可以在一个单独的单元格中输入重码,并使用绝对引用来指代该单元格,如$A$2。
=RegExpReplace(A5, $A$2, "")
然后,你可以通过使用连接运算符(&)和文本函数(如RIGHT、MID和LEFT),按照你想要的方式规范格式。
例如,要把所有电话号码写成(123) 456-7890的格式,公式是:。
="("&LEFT(B5, 3)&") "&MID(B5, 4, 3)&"-"&RIGHT(B5, 4)
其中B5是RegExpReplace函数的输出。
使用重构函数删除特殊字符
在我们的一个教程中,我们研究了如何使用内置和自定义函数删除Excel中不需要的字符。 正则表达式使事情变得简单多了!不用列出所有要删除的字符,只需指定你想保留的字符即可 :)
该模式是基于 被否定的字符类 - 在一个字符类[^]内放置一个圆点,以匹配任何不在括号内的单个字符。 + 量词迫使它将连续的字符视为单个匹配,因此对匹配的子串进行替换,而不是对每个单个字符。
根据你的需要,选择以下一个词组。
要删除 非字母数字 字符,即除字母和数字外的所有字符。
样式 : [^0-9a-zA-Z]+
要清除所有字符 除字母外 , 数字 和 空间 :
样式 : [^0-9a-zA-Z ]+
要删除所有字符 除字母外 , 数字 和 强调 ,你可以使用代表任何非字母数字字符或下划线的字符的\W。
样式 : \W+
如果你想 保留一些其他角色 例如,标点符号,把它们放在括号内。
例如,要删除除字母、数字、句号、逗号或空格以外的任何字符,请使用以下重码。
样式 : [^0-9a-zA-Z., ]+
这就成功地消除了所有的特殊字符,但多余的空白仍然存在。
为了解决这个问题,你可以将上述函数嵌套到另一个函数中,用一个空格字符替换多个空格。
=RegExpReplace(RegExpReplace(A5,$A$2,""), " +", " ")
或者直接使用本地的TRIM函数,也有同样的效果。
=TRIM(RegExpReplace(A5, $A$2, "" ))
删除非数字字符的Regex
要从一个字符串中删除所有的非数字字符,你可以使用这个长的公式或下面列出的一个非常简单的勒格函数。
匹配任何非数字的字符。
样式 : \D+
使用否定的类剥离非数字字符。
样式 : [^0-9]+
样式 : [^\d]+
提示:如果你的目标是删除文本,并将剩余的数字溢出到单独的单元格中,或者将它们全部放在一个单元格中,用指定的分隔符隔开,那么使用RegExpExtract函数,正如在如何使用正则表达式从字符串中提取数字中所解释的那样。
删除空格后的所有内容的Regex
要清除空格后的所有内容,可使用空格()或空白()字符来查找第一个空格,并使用.*来匹配它之后的任何字符。
如果你的单行字符串只包含正常的空格(在7位ASCII系统中的值为32),那么你使用下面的哪一个词组其实并不重要。 如果是多行字符串,就会有区别。
清除一切 在一个空格字符之后 ,使用这个词组。
样式 : " .*"
=RegExpReplace(A5, " .*", "")
这个公式将剥离在第一个空格后的任何东西 每行 为使结果正确显示,请确保将 "包裹文本 "打开。
剥去一切 在一个空白处之后 (包括空格、制表符、回车符和新行),该词组为。
样式 : \s.*
=RegExpReplace(A5, "\s.*", "")
Because \s matching a few different whitespace types including 一条新线 (n),这个公式会删除一个单元格中第一个空格后的所有内容,无论其中有多少行。
删除特定字符后的文本的Regex
使用前面例子中的方法,你可以消除你指定的任何字符之后的文本。
要分别处理每一行。
通用模式 : char.*
在单行字符串中,这将删除在 炭 在多行字符串中,每一行都将被单独处理,因为在VBA Regex风味中,句号(.)匹配任何字符,除了新行。
将所有行作为一个单一的字符串来处理。
通用模式 : char(.
要删除给定字符之后的任何东西,包括新行,则在模式中加入n。
例如,要删除一个字符串中第一个逗号后的文本,请尝试这些正则表达式。
样式 : ,.*
样式 : ,(.
在下面的截图中,你可以检查结果有什么不同。
删除空格前的所有内容的Regex
在处理长串文本时,有时你可能想通过删除所有单元格中的相同部分信息来使其变短。 下面我们将讨论两个这样的案例。
删除最后一个空格前的所有内容
与前面的例子一样,正则表达式取决于你对 "空格 "的理解。
要匹配任何东西,直到 最后的空间 ,这个词组就可以了(加引号是为了使星号后面的空格明显)。
样式 : ".* "
为了匹配任何在 最后的留白 (包括空格、制表符、回车符和新行),使用这个正则表达式。
样式
这种差异在多行字符串上尤其明显。
剥离第一个空格前的所有内容
要匹配一个字符串中第一个空格以下的任何内容,可以使用这个正则表达式。
样式 : ^[^ ]* +
从一个字符串^开始,我们匹配零个或多个非空格字符[^ ]*,这些字符后面紧跟着一个或多个空格" + "。 最后一部分是为了防止结果中可能出现的领先空格。
为了删除每行第一个空格之前的文字,公式是以默认的 "全部匹配 "模式编写的( 实例_num 省略)。
=RegExpReplace(A5, "^[^ ]* +", "")
要删除第一行第一个空格之前的文字,而保留所有其他行的内容,则用 实例_num 参数被设置为1。
=RegExpReplace(A5, "^[^ ]* +", "", 1)
剥离字符前的所有内容的Regex
删除特定字符之前的所有文本的最简单方法是使用类似这样的重构函数。
通用模式 : ^[^char]*char
翻译成人类的语言,它说:"从一个以^为锚的字符串开始,匹配0个或更多的字符,除了 炭 [^char]*,直到第一个出现的 炭 .
例如,要删除第一个冒号之前的所有文本,使用这个正则表达式。
样式 : ^[^:]*:
为了避免结果中出现领先的空格,可以在最后添加一个空白字符\s*。 这将删除第一个冒号之前的所有内容,并修剪它之后的任何空格。
样式 : ^[^:]*:\s*
=RegExpReplace(A5, "^[^:]*:\s*", "")
提示:除了正则表达式外,Excel还有自己的方法来按位置或匹配来删除文本。 要了解如何用本地公式完成这一任务,请看如何在Excel中删除一个字符之前或之后的文本。
Regex删除所有内容,除了
要从一个字符串中消除所有的字符,除了你想保留的那些,使用否定的字符类。
例如,如果要删除除小写字母和点以外的所有字符,重码是。
样式 : [^a-z\.]+
事实上,我们在这里可以不使用+量词,因为我们的函数会替换所有找到的匹配。 量词只是让它更快一点--你不是在处理每个单独的字符,而是替换一个子串。
=RegExpReplace(A5, "[^a-z\.]+", "")
在Excel中删除html标签的Regex
首先,应该注意的是,HTML不是一种正则语言,所以用正则表达式来解析它并不是最好的方法。 也就是说,正则表达式绝对可以帮助剥离单元格中的标签,使你的数据集更干净。
鉴于html标签总是放在角括号内,你可以用以下的一个词组找到它们。
被否定的类。
样式 :] *>。
在这里,我们匹配一个开头的角括号,后面是零个或多个出现的任何字符,除了结尾的角括号[^>]*,直到最近的结尾角括号。
懒惰的搜索。
样式 :
在这里,我们匹配从第一个开头括号到第一个结尾括号的任何内容。 问号迫使.*尽可能少地匹配字符,直到它找到一个结尾括号。
无论你选择哪种模式,结果都是绝对一样的。
例如,要从A5的一个字符串中删除所有的html标签,并留下文本,其公式为:。
=RegExpReplace(A5, "]*>", "")
或者你可以使用截图中所示的懒惰量词。
这个解决方案对于单个文本(第5-9行)来说是完美的。 对于多个文本(第10-12行)来说,结果是有问题的--来自不同标签的文本被合并成一个。 这到底对不对? 恐怕,这不是一个可以轻易决定的事情--一切都取决于你对所需结果的理解。 例如,在B11,结果 "A1 "是预期的;而在B10,你可能希望"data1 "和 "data2 "要用一个空格隔开。
要删除html标签,用空格分隔剩余的文本,可以这样进行。
- 用空格""替换标签,而不是空字符串。
=RegExpReplace(A5, "]*>", " ")
- 将多个空格减为一个空格字符。
=RegExpReplace(RegExpReplace(A5, "]*>", "), " +", ")
- 修剪前面和后面的空格。
=TRIM(RegExpReplace(A5, "]*>", "), " +", "))
结果将看起来像这样。
Ablebits Regex移除工具
如果你有机会使用我们的Excel终极套件,你可能已经发现了最近发布的新的Regex工具。 这些基于.NET的Regex函数的优点在于,首先,它们支持全功能的正则表达式语法,不受VBA RegExp的限制,其次,不需要在你的工作簿中插入任何VBA代码,因为所有的代码都是集成的由我们在后端提供。
你的部分工作是构建一个正则表达式,并将其提供给函数 :) 让我在一个实际的例子中向你展示如何做到这一点。
如何使用regex删除括号和小括号中的文本
在长文本字符串中,不太重要的信息往往被括在[括号]和(小括号)中。 如何删除这些不相关的细节,保持所有其他数据?
事实上,我们已经建立了一个类似的铰链,用于删除html标签,即角括号内的文本。 很明显,同样的方法也适用于方括号和圆括号。
样式 : (\(.*?\))
诀窍是使用懒惰量词(*?)来匹配最短的子串。 第一组(\(.*?\))匹配从开头小括号到第一个结束小括号的任何内容。 第二组(\[.*?\])匹配从开头小括号到第一个结束小括号的任何内容。 竖杠
在确定了模式之后,让我们把它 "喂 "给我们的Regex Remove函数。 具体方法如下。
- 关于 阿博比特数据 选项卡,在 文本 组,点击 Regex工具 .
要想以公式而不是数值的形式获得结果,请选择 作为一个公式插入 复选框。
为了从A2:A5的字符串中删除括号内的文本,我们对设置进行了如下配置。
结果是, AblebitsRegexRemove 函数被插入到你的原始数据旁边的一个新列中。
该函数也可以直接在单元格中通过标准的 插入功能 对话框中,它被归类为 AblebitsUDFs .
如 AblebitsRegexRemove 它只需要两个参数--源字符串和regex。 这两个参数可以直接在公式中定义,或者以单元格引用的形式提供。 如果需要,这个自定义函数可以和任何本地函数一起使用。
例如,为了修剪产生的字符串中多余的空格,你可以利用TRIM函数作为包装器。
=TRIM(AblebitsRegexRemove(A5, $A$2))
这就是如何使用正则表达式在Excel中删除字符串的方法。 感谢你的阅读,并期待下周在我们的博客上见到你!
可用的下载
使用regex删除字符串 - 示例 (.xlsm文件)
终极套房 - 试用版 (.exe文件)