【发布时间】:2017-10-14 16:54:16
【问题描述】:
我正在尝试捕获文本中的所有产品代码。它们有时是多个。我只能抓到一个。我想它更多的是 excel vba 问题而不是正则表达式,因为我有 str 模式。
Sub regexp()
Dim regEx As New regexp
Dim strPattern As String
Dim Myrange As Range
Dim LastRow As Integer
LastRow = ActiveSheet.Cells(Rows.Count, "W").End(xlUp).Row
Set Myrange = ActiveSheet.Range("W4:W" & LastRow)
For Each c In Myrange
strPattern = "(?:\s[ABCDabcd][0-9][A-Za-z0-9]{3}\s|\s[ABCDabcd][0-9oO][0-9oO)][0-9][0-9A-Za-z]\s|\s[ABCDabcd][0-9oO][0-9A-Za-z)][0-9A-Za-z][0-9]\s|[^A-Za-z0-9][ABCDabcd]\s[0-9][A-Z0-9a-z]{3}\s)"
If strPattern <> "" Then
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
Set matches = regEx.Execute(c.Value)
On Error Resume Next
c.Offset(0, 7).Value = matches.Item(0)
End If
Next c
End Sub
如何更改代码以捕获文本中不同的多个字符串模式。此代码当前仅捕获第一个。我想用逗号分隔所有内容。 例如,首先我遇到了产品 b0067 的问题。然后问题就解决了。后来我遇到了这个 D0887 的问题。紧随其后的是 C689W、D 7890 输出 - b0067、D0887、C689W、D 7890 我想修剪这些,因为空格是在结尾或开头考虑的。
【问题讨论】:
-
您只需使用第一项 -
matches.Item(0)。遍历集合并将数据输出到您想要的位置。您想在哪里输出匹配项?但是,我也认为你的模式很慢,因为你的替代方案没有优化。您也可能无法从" A0ABC B0ABC "字符串中提取 2 个值。你真的需要在最后匹配一个空格,还是只检查是否有空格? -
我现在使用 c.offset(0,7) 在 AD 列中的 7 列之后输出。数据很混乱,所以想理想地捕获 5 个字符,但我认为最好的方法是 \s,但如果它们以句号结尾,我会错过。”