正则表达式,用8个数字或正好7个数字提取数字,如果数字有更多数字,则丢弃

时间:2017-05-29 07:17:24

标签: regex excel

我需要从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 ### |

仍然不准确

2 个答案:

答案 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

演示:https://regex101.com/r/2R5HRN/2