Regex 正则表达式捕获字符串模式的多个不同出现
我试图捕获文本中的所有产品代码。它们有时是多重的。我只能捕获一个。我想这更多的是excel vba问题,而不是正则表达式,因为我有str模式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
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:参见完整的固定接头。