如何在Microsoft Excel中使用正则表达式(正则表达式)
如何在Excel中使用正则表达式并利用Excel的强大网格(如设置数据操作)?
我知道正则表达式在许多情况下并不理想(要使用或不使用正则表达式?),因为excel可以使用Left
, Mid
, Right
, Instr
类型命令进行类似的操作。
正则表达式用于模式匹配。
要在Excel中使用,请按以下步骤操作:
步骤1 :将VBA引用添加到“Microsoft VBScript Regular Expressions 5.5”
第2步 :定义你的模式
基本定义:
-
范围。
az
与从a到z的小写字母匹配 0-5
匹配从0到5的任何数字 []
恰好与这些括号内的一个对象匹配。
[a]
匹配字母a [abc]
匹配单个字母,可以是a,b或c [az]
匹配字母表中的任何单个小写字母。 ()
为返回目的分组不同的匹配。 看下面的例子。
{}
用于在其之前定义的模式的重复副本的乘数。
[a]{2}
匹配两个连续的小写字母a: aa
[a]{1,3}
至少匹配一个和最多三个小写字母a
, aa
, aaa
+
匹配之前定义的至少一个或多个模式。
a+
将匹配连续的a
, aa
, aaa
等 ?
匹配之前定义的零或一个模式。
[az]?
匹配空字符串或任何单个小写字母。 *
匹配之前定义的零个或多个模式。 - 例如通配符可能存在或不存在的模式。 - 例如[az]*
匹配空字符串或小写字母串。
.
匹配除换行符之外的任何字符n
a.
匹配以字母开头的两个字符串,并以除n
以外的任何内容结尾 |
OR运算符
a|b
表示a
或b
可以匹配。 red|white|orange
恰好匹配其中一种颜色。 ^
NOT运算符
[^0-9]
字符不能包含数字 [^aA]
字符不能是小写的a
或大写的A
转义后面的特殊字符(覆盖上面的行为)
.
,
, (
, ?
, $
, ^
锚定模式:
^
匹配必须发生在字符串的开头
^a
第一个字符必须是小写字母a
^[0-9]
第一个字符必须是数字。 $
匹配必须出现在字符串末尾
a$
最后一个字符必须是小写字母a
优先表:
Order Name Representation
1 Parentheses ( )
2 Multipliers ? + * {m,n} {m, n}?
3 Sequence & Anchors abc ^ $
4 Alternation |
预定义的字符缩写:
abr same as meaning
d [0-9] Any single digit
D [^0-9] Any single character that's not a digit
w [a-zA-Z0-9_] Any word character
W [^a-zA-Z0-9_] Any non-word character
s [ rtnf] Any space character
S [^ rtnf] Any non-space character
n [n] New line
示例1 :以宏运行
下面的示例宏查看单元格A1
中的值以查看前1或2个字符是否为数字。 如果是这样,他们被删除,并显示其余的字符串。 如果不是,则会出现一个框,告诉您没有找到匹配项。 12abc
单元格A1
值将返回abc
, 1abc
值将返回abc
, abc123
值将返回“未匹配”,因为数字不在字符串的起始位置。
Private Sub simpleRegex()
Dim strPattern As String: strPattern = "^[0-9]{1,2}"
Dim strReplace As String: strReplace = ""
Dim regEx As New RegExp
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1")
If strPattern <> "" Then
strInput = Myrange.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.Test(strInput) Then
MsgBox (regEx.Replace(strInput, strReplace))
Else
MsgBox ("Not matched")
End If
End If
End Sub
示例2 :作为内嵌函数运行
此示例与示例1相同,但设置为作为内嵌函数运行。 要使用,请将代码更改为:
Function simpleCellRegex(Myrange As Range) As String
Dim regEx As New RegExp
Dim strPattern As String
Dim strInput As String
Dim strReplace As String
Dim strOutput As String
strPattern = "^[0-9]{1,3}"
If strPattern <> "" Then
strInput = Myrange.Value
strReplace = ""
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.test(strInput) Then
simpleCellRegex = regEx.Replace(strInput, strReplace)
Else
simpleCellRegex = "Not matched"
End If
End If
End Function
将您的字符串(“12abc”)放在单元格A1
。 在单元格B1
输入此公式=simpleCellRegex(A1)
,结果将为“abc”。
示例3 :循环范围
此示例与示例1相同,但循环了一系列单元格。
Private Sub simpleRegex()
Dim strPattern As String: strPattern = "^[0-9]{1,2}"
Dim strReplace As String: strReplace = ""
Dim regEx As New RegExp
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1:A5")
For Each cell In Myrange
If strPattern <> "" Then
strInput = cell.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.Test(strInput) Then
MsgBox (regEx.Replace(strInput, strReplace))
Else
MsgBox ("Not matched")
End If
End If
Next
End Sub
示例4 :拆分不同的图案
这个例子循环遍历一个范围( A1
, A2
和A3
),并查找一个以三位数字开头的字符串,后跟一个字母字符,然后是四位数字。 输出通过使用()
将模式匹配拆分为相邻的单元格。 $1
表示在第一组()
内匹配的第一个模式。
Private Sub splitUpRegexPattern()
Dim regEx As New RegExp
Dim strPattern As String
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1:A3")
For Each C In Myrange
strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"
If strPattern <> "" Then
strInput = C.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.test(strInput) Then
C.Offset(0, 1) = regEx.Replace(strInput, "$1")
C.Offset(0, 2) = regEx.Replace(strInput, "$2")
C.Offset(0, 3) = regEx.Replace(strInput, "$3")
Else
C.Offset(0, 1) = "(Not matched)"
End If
End If
Next
End Sub
结果:
其他模式示例
String Regex Pattern Explanation
a1aaa [a-zA-Z][0-9][a-zA-Z]{3} Single alpha, single digit, three alpha characters
a1aaa [a-zA-Z]?[0-9][a-zA-Z]{3} May or may not have preceeding alpha character
a1aaa [a-zA-Z][0-9][a-zA-Z]{0,3} Single alpha, single digit, 0 to 3 alpha characters
a1aaa [a-zA-Z][0-9][a-zA-Z]* Single alpha, single digit, followed by any number of alpha characters
</i8> </[a-zA-Z][0-9]> Exact non-word character except any single alpha followed by any single digit
要直接在Excel公式中使用正则表达式,以下UDF(用户定义函数)可以提供帮助。 它或多或少直接将正则表达式功能作为excel函数公开。
怎么运行的
它需要2-3个参数。
$0
, $1
, $2
等等。 $0
是整个比赛, $1
和up对应于正则表达式中的各个比赛组。 默认为$0
。 一些例子
提取电子邮件地址:
=regex("Peter Gordon: some@email.com, 47", "w+@w+.w+")
=regex("Peter Gordon: some@email.com, 47", "w+@w+.w+", "$0")
结果在: some@email.com
提取几个子字符串:
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (d+)$", "E-Mail: $2, Name: $1")
结果于: E-Mail: some@email.com, Name: Peter Gordon
将单个单元格中的组合字符串拆分为多个单元格中的组件:
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (d+)$", "$" & 2)
结果在: Peter Gordon
some@email.com
...
如何使用
要使用此UDF,请执行以下操作(大致基于此Microsoft页面,它们有一些很好的附加信息!):
ALT+F11
打开Microsoft Visual Basic for Applications编辑器。 点击插入模块。 如果你给你的模块一个不同的名字,确保模块名称与下面的UDF名称不同(例如命名模块regex
Regex
和函数regex
导致#NAME!错误)。
在中间的大文本窗口中插入以下内容:
Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
Dim replaceNumber As Integer
With inputRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = matchPattern
End With
With outputRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "$(d+)"
End With
With outReplaceRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
End With
Set inputMatches = inputRegexObj.Execute(strInput)
If inputMatches.Count = 0 Then
regex = False
Else
Set replaceMatches = outputRegexObj.Execute(outputPattern)
For Each replaceMatch In replaceMatches
replaceNumber = replaceMatch.SubMatches(0)
outReplaceRegexObj.Pattern = "$" & replaceNumber
If replaceNumber = 0 Then
outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
Else
If replaceNumber > inputMatches(0).SubMatches.Count Then
'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
regex = CVErr(xlErrValue)
Exit Function
Else
outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
End If
End If
Next
regex = outputPattern
End If
End Function
保存并关闭Microsoft Visual Basic for Applications编辑器窗口。
对于那些急于求成的人来说,扩展patszim的答案。
添加下面的代码:
Function RegxFunc(strInput As String, regexPattern As String) As String
Dim regEx As New RegExp
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.pattern = regexPattern
End With
If regEx.Test(strInput) Then
Set matches = regEx.Execute(strInput)
RegxFunc = matches(0).Value
Else
RegxFunc = "not matched"
End If
End Function
正则表达式模式放置在其中一个单元格中,并使用绝对引用 。 函数将与其创建的工作簿绑定。
如果需要在不同的工作簿中使用它,请将该函数存储在Personal.XLSB中
上一篇: How to use Regular Expressions (Regex) in Microsoft Excel both in
下一篇: DOMDocument::loadHTML(): input conversion failed due to input error