如何通过函数或自定义函数在excel中获得正则表达式支持?

blu*_*ers 21 regex excel vba

看来除了通过VBA之外,excel中不支持正则表达式(如正则表达式中那样).是这样,如果是,是否有任何支持正则表达式的"开源"自定义VBA功能.在这种情况下,我希望在字符串中提取复杂模式,但是在函数本身中公开对正则表达式的支持的自定义VBA函数的任何实现都是有用的.如果您知道半功能函数(如IS函数),请感觉评论,但我真的在寻找通过函数公开的完整正则表达式实现.如果实施良好,甚至可能愿意使用加载项付费.

另外,我只是在Windows 7上使用Office 2010; 在看起来是一个很好的建议的答案结果不适用于Office 2010之后添加了此信息.

如果您有任何疑问,请发表评论.

mwo*_*e02 31

没有内置到Excel中.VBScript具有内置支持,可以从VBA调用.这里有更多信息.您可以使用VBA中的后期绑定来调用对象.我已经包含了最近放在一起的一些功能.请注意,这些都没有经过充分测试,可能有一些错误,但它们非常简单.

这应该至少让你开始:

'---------------------------------------------------------------------------------------vv
' Procedure : RegEx
' Author    : Mike
' Date      : 9/1/2010
' Purpose   : Perform a regular expression search on a string and return the first match
'               or the null string if no matches are found.
' Usage     : If Len(RegEx("\d{1,2}[/-]\d{1,2}[/-]\d{2,4}", txt)) = 0 Then MsgBox "No date in " & txt
'           : TheDate = RegEx("\d{1,2}[/-]\d{1,2}[/-]\d{2,4}", txt)
'           : CUSIP = Regex("[A-Za-z0-9]{8}[0-9]",txt)
'---------------------------------------------------------------------------------------
'^^
Function RegEx(Pattern As String, TextToSearch As String) As String 'vv
    Dim RE As Object, REMatches As Object

    Set RE = CreateObject("vbscript.regexp")
    With RE
        .MultiLine = False
        .Global = False
        .IgnoreCase = False
        .Pattern = Pattern
    End With

    Set REMatches = RE.Execute(TextToSearch)
    If REMatches.Count > 0 Then
        RegEx = REMatches(0)
    Else
        RegEx = vbNullString
    End If
End Function '^^

'---------------------------------------------------------------------------------------
' Procedure : RegExReplace
' Author    : Mike
' Date      : 11/4/2010
' Purpose   : Attempts to replace text in the TextToSearch with text and back references
'               from the ReplacePattern for any matches found using SearchPattern.
' Notes     - If no matches are found, TextToSearch is returned unaltered.  To get
'               specific info from a string, use RegExExtract instead.
' Usage     : ?RegExReplace("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My phone # is 570.555.1234.", "$1($2)$3-$4$5")
'             My phone # is (570)555-1234.
'---------------------------------------------------------------------------------------
'
Function RegExReplace(SearchPattern As String, TextToSearch As String, ReplacePattern As String, _
                      Optional GlobalReplace As Boolean = True, _
                      Optional IgnoreCase As Boolean = False, _
                      Optional MultiLine As Boolean = False) As String
Dim RE As Object

    Set RE = CreateObject("vbscript.regexp")
    With RE
        .MultiLine = MultiLine
        .Global = GlobalReplace
        .IgnoreCase = IgnoreCase
        .Pattern = SearchPattern
    End With

    RegExReplace = RE.Replace(TextToSearch, ReplacePattern)
End Function

'---------------------------------------------------------------------------------------
' Procedure : RegExExtract
' Author    : Mike
' Date      : 11/4/2010
' Purpose   : Extracts specific information from a string.  Returns empty string if not found.
' Usage     : ?RegExExtract("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My phone # is 570.555.1234.", "$2$3$4")
'             5705551234
'             ?RegExExtract("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My name is Mike.", "$2$3$4")
'
'             ?RegExReplace("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My name is Mike.", "$2$3$4")
'             My name is Mike.
'---------------------------------------------------------------------------------------
'
Function RegExExtract(SearchPattern As String, TextToSearch As String, PatternToExtract As String, _
                      Optional GlobalReplace As Boolean = True, _
                      Optional IgnoreCase As Boolean = False, _
                      Optional MultiLine As Boolean = False) As String
Dim MatchFound As Boolean

    MatchFound = Len(RegEx(SearchPattern, TextToSearch)) > 0
    If MatchFound Then
        RegExExtract = RegExReplace(SearchPattern, TextToSearch, PatternToExtract, _
                                    GlobalReplace, IgnoreCase, MultiLine)
    Else
        RegExExtract = vbNullString
    End If
End Function
Run Code Online (Sandbox Code Playgroud)


Rio*_*ams 9

这是关于Excel中正则表达式使用的帖子:

http://mathfest.blogspot.com/2010/03/regular-expressions-in-excel.html

希望能帮助到你.

另一个使用Python和IronSpread

http://mathfest.blogspot.ca/2012/06/using-ironspread-and-regular.html

  • 只是一个更新,看来问题与Office2010-Win7上的64位有关http://www.mrexcel.com/forum/showthread.php?t=467397此时真的不想切换到32-对于Office 2010而言,我认为我会将此信息添加到您的答案中以防其他人正在调查. (2认同)

小智 7

OpenOffice/LibreOffice Calc中包含函数中的regexp使用.要激活,请转到工具>选项>计算>计算:Y =在公式中启用正则表达式.我已经多次使用过了.