我一直在尝试构建一个正则表达式来从字符串中提取 7 位数字,但很难获得正确的模式。
示例字符串 -WO1519641 WO1528113TB WO1530212 TB
返回示例 -1519641, 1528113, 1530212
我在 Excel 中使用的代码是...
Private Sub Extract7Digits()
Dim regEx As New RegExp
Dim strPattern As String
Dim strInput As String
Dim strReplace As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1:A300")
For Each c In Myrange
strPattern = "\D(\d{7})\D"
'strPattern = "(?:\D)(\d{7})(?:\D)"
'strPattern = "(\d{7}(\D\d{7}\D))"
strInput = c.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.test(strInput) Then
Set matches = regEx.Execute(strInput)
For Each Match In matches
s = s & " Word: " & Match.Value & " "
Next
c.Offset(0, 1) = s
Else
s = ""
End If
Next
End Sub
Run Code Online (Sandbox Code Playgroud)
O1519641, O1528113T, O1530212我已经尝试了该代码中的所有 3 种模式,但最终在使用时得到了返回"\D(\d{7})\D"。据我现在了解,()由于我存储匹配的方式,这没有任何意义,而我最初认为它们意味着表达式将返回().
我一直在http://regexr.com/上进行测试,但我仍然不确定如何让它允许数字按原样位于字符串内,WO1528113TB但只返回数字。我是否需要对正则表达式的返回值运行正则表达式以排除第二次的字母?
我建议使用以下模式:
strPattern = "(?:^|\D)(\d{7})(?!\d)"
Run Code Online (Sandbox Code Playgroud)
然后,您将能够(\d{7})通过 访问捕获组#1 的内容(即使用正则表达式的部分捕获的文本)match.SubMatches(0),然后您可以检查哪个值是最大的。
图案详情:
(?:^|\D)- 匹配字符串 ( ^) 或非数字 ( \D)开头的非捕获组(不创建任何子匹配)(\d{7})- 捕获第1组匹配的7位数字(?!\d)- 如果 7 位数字后紧接着有一个数字,则负向预测会使匹配失败。