2017-07-13 78 views
0

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

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

我已经使用UDF给出有所谓的删除这需要一个正则表达式的说法。现在,我仍然无法删除我想删除的所有项目。

在附件的Excel中,您可以看到我所尝试的以及我正在寻找的答案。 这里是我想删除的前缀: 括号内开始的数字 - 理想情况下,我希望在一个单独的列中。 连字符前的任意字母有一些“l-”,“al-” ,然后是下面的这些前缀。 双 亿元 发 WA 沃尔玛

我怎样写一个正则表达式这将删除所有上面的前缀?

这里是我使用UDF: 功能删除(objCell量程,strPattern作为字符串)

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

端功能

这里是链接到XLSM文件,其中包含数据I有: https://www.dropbox.com/s/et9ee727ompj5fl/Regex%20Trials.xlsm?dl=0

,这里是一个截图告诉你我在寻找:

enter image description here

+2

我不知道怎么的模式正则表达式中VBA工作,但我想你”您需要使用脱字符号来定位字符串的开始处的正则表达式,垂直栏符号将表达式和可选匹配的问号符号。在perl兼容的正则表达式中,您还可以使用(?!\ w)指定不应跟随任何单词字符。例如'Regex.Replace(Obj.CellValue,“^(l- | al- | bi | bil | fa | wa | wal)”)或'^(l- | al- | bi | bil | fa | wa | WAL)(\ W)'?!。这有帮助吗? – rubystallion

+0

@rubystallion,非常感谢。它确实有帮助。在发布的所有解决方案中,您的解决方案为我提供了一些具体的工作。我认为,VBA中的正则表达式模式与其他语言的工作方式相似。在玩了一段时间之后,我发现这种模式与我的许多答案相匹配 - (l- | al- | bi | bil | fa | wa- | wa)。在这里,如果我有脱字符号,它似乎不起作用。为什么?此外,在这种情况下,我需要编写另一个正则表达式首先使用[0-9 :()]删除括号中的数字 - 是否有将这两种方法合并为一个正则表达式的方法? –

回答

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 
+0

我还添加了wa'作为前缀,因为这似乎是从示例数据的倒数第二行指示的 – Tragamor

+0

为什么不使用'RegEx'?所有你正在做的是建立你自己的版本 – Tom

+0

大部分,因为我没有用太多,我觉得这个命名有点过分;上面的代码只是允许通过更改数组值来轻松添加或更改前缀。 (我知道你也可以用正则表达式来做同样的事情) – Tragamor

0

不是100%完美的话,但应该得到一个订单,你开始

正则表达式 (\d+\:)+\d+

(\d+\:)

击穿查找匹配的格式,所述支架后x:

加然后告诉它,这是一个重复的图案的任何模式。 最后的\d+最后一个数字相匹配的字符串,这样的正则表达式会找到适合x:x:x

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

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 
+0

嗨,汤姆,谢谢你的回答。但是我需要一些评论来理解正则表达式的真实效果。 2正则表达式在做什么?我尝试了两个例子,我没有得到我想要的东西。所以,我真的需要解释一下上述2个正则表达式是如何在我给出的例子上运行的。 –

+0

我更新了正则表达式的笔记。它不完全是如何工作的? – Tom

相关问题