我正在尝试清除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
这是一个屏幕截图,向您展示我在寻找的内容:
答案 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