Regex 正则表达式捕获字符串模式的多个不同出现

Regex 正则表达式捕获字符串模式的多个不同出现,regex,excel,vba,Regex,Excel,Vba,我试图捕获文本中的所有产品代码。它们有时是多重的。我只能捕获一个。我想这更多的是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 Myrang

我试图捕获文本中的所有产品代码。它们有时是多重的。我只能捕获一个。我想这更多的是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
Sub regexp()
Dim regEx作为新的regexp
作为字符串的Dim strPattern
将Myrange变暗为Range
将最后一行设置为整数
LastRow=ActiveSheet.Cells(Rows.Count,“W”).End(xlUp).Row
设置Myrange=ActiveSheet.Range(“W4:W”和LastRow)
对于Myrange中的每个c
strPattern=“(?:\s[ABCDabcd][0-9][A-Za-z0-9][3}\s|s[ABCDabcd][0-9oO][0-9oO][0-9o][0-9A-Za-z][s | \s[ABCDabcd][0-9A-Za-z][0-9][s |[A-Za-Za-Za-9][0-9][ABCDabcd][s][0-9]
如果strPattern“”则
用正则表达式
.Global=True
.MultiLine=True
.IgnoreCase=False
.Pattern=strPattern
以
Set matches=regEx.Execute(c.Value)
出错时继续下一步
c、 偏移量(0,7)。值=匹配项。项(0)
如果结束
下一个c
端接头
如何更改代码以捕获文本中不同的多字符串模式。此代码当前仅捕获第一个。我想捕获所有以逗号分隔的内容。 首先,我对产品b0067有问题。然后问题就解决了。后来,我遇到了这个D0887的问题。随后是C689W,D7890输出-b0067,D0887,C689W,D7890
我想在结尾或开头考虑空格时对其进行修剪。

首先,我建议将正则表达式增强为

strPattern = "(?:\s[abcd](?:[0-9][a-z0-9]{3}|[0-9o][0-9o)][0-9][0-9a-z]|[0-9o][0-9a-z)][0-9a-z][0-9])|[^a-z0-9][abcd]\s[0-9][0-9a-z]{3})(?!\S)"
看。确保设置了
。IgnoreCase=True
。此正则表达式将检查在与
(?!\S)
前瞻匹配后是否有空格或字符串结尾,因此
A0ABC
B0ABC
将从
“1 A0ABC B0ABC 3”
中提取。第一个
\s
可以更改为
(^ |\s)
,以匹配字符串开头的字符串

然后,在运行
Execute()
之后,对匹配项进行迭代:

 Set matches = regEx.Execute(c.Value)
 For Each m In matches
    Cells(x, y) = m.Value
 Next
这是一个完整的固定
sub
,将匹配项作为逗号分隔的值打印到指定的单元格:

Dim regEx As New regexp
Dim strPattern As String
Dim Myrange As Range
Dim LastRow As Long, cnt As Long

LastRow = ActiveSheet.Cells(Rows.Count, "W").End(xlUp).Row
Set Myrange = ActiveSheet.Range("W4:W" & LastRow)
strPattern = "(?:\s[abcd](?:[0-9][a-z0-9]{3}|[0-9o][0-9o)][0-9][0-9a-z]|[0-9o][0-9a-z)][0-9a-z][0-9])|[^a-z0-9][abcd]\s[0-9][0-9a-z]{3})(?!\S)"

If strPattern <> "" Then
  With regEx
    .Global = True
    .IgnoreCase = True
    .Pattern = strPattern
  End With
  cnt = 0
  For Each c In Myrange
    Set matches = regEx.Execute(c.Value)
    For Each m In matches
        c.Offset(0, 7).Value = c.offset(0, 7).Value + m.Value
        cnt = cnt + 1
        If cnt < matches.Count Then c.offset(0, 7) = c.offset(0, 7) & ","
    Next
  Next c
End If
Dim regEx作为新的regexp
作为字符串的Dim strPattern
将Myrange变暗为Range
变暗最后一行一样长,cnt一样长
LastRow=ActiveSheet.Cells(Rows.Count,“W”).End(xlUp).Row
设置Myrange=ActiveSheet.Range(“W4:W”和LastRow)
strPattern=“(?:\s[abcd](?:[0-9][a-z0-9][0-9o][0-9o][0-9a-z][0-9a-z][0-9o][0-9a-z][0-9a-z][0-9])[a-z0 9][abcd]\s[0-9][0-9a-z][3}(?!\s)”
如果strPattern“”则
用正则表达式
.Global=True
.IgnoreCase=True
.Pattern=strPattern
以
cnt=0
对于Myrange中的每个c
Set matches=regEx.Execute(c.Value)
对于匹配中的每个m
c、 偏移量(0,7)。值=c偏移量(0,7)。值+m值
cnt=cnt+1
如果cnt

注意RegExp初始化的位置-在循环外部。

您只需使用第一项-
匹配项。项(0)
。迭代集合并在需要的地方输出数据。您想在哪里输出匹配项?然而,我也认为您的模式非常慢,因为您的备选方案没有得到优化。您也可能无法从
“A0ABC B0ABC”
字符串中提取2个值。您真的需要在末尾匹配一个空格,还是只检查是否有空格?我现在使用c.offset(0,7)在AD列中的7列之后输出。数据杂乱无章,因此我希望理想地捕获5个字符,但我认为最好的方法是\s,但如果它们以句号结尾,我确实会错过。我还原了指向演示的链接(使用PCRE设置TIG),以便可以忽略格式设置。y应为30(AD列)我的x值应该是什么?我应该如何更改xvalue@viji:我认为打印值没有问题。您可以使用计数器,并在每次从集合检索新值时递增它。然后是增量行或列值。对不起,我不明白。我想在列AD中看到每个用逗号分隔的对应字符串的结果。在我上面的例子中,W是我的字符串所在的位置,我希望看到多个值,如果它们出现在AD中的字符串中,它们之间用comma@viji:参见完整的固定接头。