我需要从excel文件中的列中提取7位数或8位数的数字,并且需要丢弃任何数字更多的数字。
例如,假设这些是一些值
2569123659 |从>提取任何内容8位数
2456789 | 2456789 |提取7位数
15034891 | 15034891 |提取8位数
2569123659 45785612 | 45785612 |仅提取8位数
2456789 2569123659 | 2456789 |仅提取7位数
ABC#2456789 | 2456789 |仅提取数字
ABC15034891DSC | 15034891 |仅提取数字
ABC15034891 ### | 15034891 |仅提取数字
以下是我试过的一些表达方式
strPattern =“[0-9] {7}([0-9] {1})?”
结果:错误的结果
2569123659 | 2456789
2456789 | 15034891
15034891 | 25691236
2569123659 45785612 | 2456789
2456789 2569123659 | 2456789
ABC#2456789 | 2456789
ABC15034891DSC | 15034891
ABC15034891 ### | 15034891
strPattern =“(\ d {8} | \ d {7})”
结果:结果仍然错误
2569123659 | 25691236
2456789 | 2456789
15034891 | 15034891
2569123659 45785612 | 25691236
2456789 2569123659 | 2456789
ABC#2456789 | 2456789
ABC15034891DSC | 15034891
ABC15034891 ### | 15034891
帮我纠正这个reg表达式,以便处理这个场景。我只需要提取正确的数字。我需要避免从另一个没有更多数字的提取。
任何形式的帮助都将受到高度赞赏。
提前致谢
根据此处提供的答案,我也尝试了
strPattern =“\ b(\ d {7,8})\ b”
结果:结果仍然错误
2569123659 |
2456789 | 2456789
15034891 | 15034891
2569123659 45785612 | 45785612
2456789 2569123659 | 2456789
ABC#2456789 |
ABC15034891DSC |
ABC15034891 ### |
仍然不准确
答案 0 :(得分:2)
使用以下正则表达式:
(?:^|\D)(\d{7,8})(?!\d)
您的7位或8位数字将位于.Submatches(0)
。
(?:^|\D)
匹配字符串的开头或非数字,如果在七位或八位数之后立即向右找到数字,则负前瞻(?!\d)
会失败。
请参阅regex demo。
查看示例代码:
Sub GetResults()
Dim rExp As Object, allMatches As Object, match As Object
Dim text As String
text = "ABC15034891###"
Set rExp = CreateObject("vbscript.regexp")
With rExp
.Global = True
.MultiLine = False
.pattern = "(?:^|\D)(\d{7,8})(?!\d)"
End With
Set allMatches = rExp.Execute(text)
For Each match In allMatches
Debug.Print(match.SubMatches.Item(0))
Next
End Sub
答案 1 :(得分:1)
试试\D(\d{7,8})\D
:
\b -> word boundary
\d -> digit [0-9]
\D -> non digit