正则表达式模式从Excel

时间:2017-07-13 07:51:23

标签: excel excel-vba vba

我正在尝试清除Excel中的一组字符串,以在删除一些前缀和额外字符后提取某些单词。最初我用FIND,LEFT,MID等尝试这个。然后,我遇到了这个有用的帖子并试着用正则表达式。

https://superuser.com/questions/794536/excel-formulas-for-stripping-out-prefix-suffix-around-number

我使用了名为Remove的UDF,它接受了一个正则表达式参数。现在,我仍然无法删除我想删除的所有项目。

在随附的Excel中,您可以看到我尝试过的内容以及我正在寻找的答案。 以下是我想删除的前缀: 开头的数字用括号括起来 - 理想情况下我想在一个单独的列中。 连字符前面的任何一个词都有一些'l - ','al-' 然后是这些前缀。 双 BIL F A WA 沃尔

如何编写一个可以删除所有上述前缀的正则表达式?

这是我正在使用的UDF: 函数Remove(objCell As Range,strPattern As String)

Dim RegEx As Object
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Global = True
RegEx.Pattern = strPattern
Remove = RegEx.Replace(objCell.Value, "")

结束功能

以下是XLSM文件的链接,其中包含我拥有的数据: https://www.dropbox.com/s/et9ee727ompj5fl/Regex%20Trials.xlsm?dl=0

这是一个屏幕截图,向您展示我在寻找的内容:

enter image description here

2 个答案:

答案 0 :(得分:0)

我不会使用正则表达式:你可以对单元格值进行拆分并根据定义的前缀数组测试前缀:

  

注意:数组值的顺序是其他前缀的子字符串稍后在列表中

Public Function RemovePrefix(RngSrc As Range) As String
    If RngSrc.Count > 1 Then Exit Function

On Error GoTo ExitFunction
    Dim Prefixs() As String: Prefixs = Split("wal,wa',wa,bil,bi,fa", ",")

    Dim Arr() As String, i As Long, Temp As String

    Arr = Split(RngSrc, "-")
    If UBound(Arr) > 0 Then
        RemovePrefix = Arr(UBound(Arr))
        Exit Function
    End If

    Arr = Split(RngSrc, " ")
    For i = 0 To UBound(Prefixs)
        Temp = Arr(UBound(Arr))
        If InStr(Temp, Prefixs(i)) = 1 Then
            RemovePrefix = Right(Temp, Len(Temp) - Len(Prefixs(i)))
            Exit Function
        End If
    Next i
    RemovePrefix = Temp

ExitFunction:
    If Err Then RemovePrefix = "Error"
End Function

答案 1 :(得分:0)

不是100%完美的单词,但应该让你开始

RegEx (\d+\:)+\d+的细分

(\d+\:)找到符合格式x:

的所有模式

括号之后的加号告诉它这是一个重复的模式。 最后,\d+匹配字符串中的最后一位数,以便正则表达式找到匹配x:x:x的模式

下一个RegEx (?!l-|al-|a-|wa-|fa-|bi-)[a-z].*要复杂得多。 首先让我们看一下[a-z]。这告诉它匹配a和z之间的任何字符。然后,我们想要捕获剩余的单词,使用.*它捕获从第一个匹配到字符串结尾的所有内容(包括非a-z字符)。但是,我们不希望它在连字符之前捕获字符串的第一部分(在大多数情况下),因此使用?!我们使用所谓的负向前看。这会查找括号内的任何内容并忽略这些位。 |只是意味着或。因此该比赛中的任何内容都将被忽略。 转到http://regexr.com/如果你想玩游戏是一个方便的网站来学习/测试RegEx

Public Sub test()
    Dim rng As Range
    Dim matches
    Dim c

    With Sheet1
        Set rng = .Range(.Cells(2, 1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1))
    End With

    For Each c In rng
        With c
            .Offset(0, 6) = ExecuteRegEx(.Value2, "(\d+\:)+\d+")
            .Offset(0, 7) = ExecuteRegEx(.Value2, "(?!l-|al-|a-|wa-|fa-|bi-)[a-z].*")
        End With
    Next c

End Sub
Public Function ExecuteRegEx(str As String, pattern As String) As String
    Dim RegEx As Object
    Dim matches

    Set RegEx = CreateObject("VBScript.RegExp")
    With RegEx
        .Global = True
        .ignorecase = False

        .pattern = pattern
        If .test(str) Then
            Set matches = .Execute(str)
            ExecuteRegEx = matches(0)
        Else
            ExecuteRegEx = vbNullString
        End If
    End With
End Function