正则表达式模式难度

时间:2018-09-04 17:42:04

标签: regex excel vba

在我的正则表达式模式方面遇到麻烦

我需要一个模式来仅提取精确的5个连续数字

示例A:123456789 dsadss 12345 @ 3_- 1d22d333

示例B: 12345 _ 2d2d2 aaa2222a

示例C:2d2jj ddd _ @ 12345

想要的输出: 12345

(非数字:“ espace”;“字母”;“符号:,&等”)(连续5个数字)(非数字:“ espace”;“字母”;“符号” :,-&等“)

(连续5个数字)(非数字:“ espace”;“ letter”;“ symbols:,-&等”)

(非数字:“ espace”;“字母”;“ symbols:,-&等”)(连续5个数字)

到目前为止已经尝试过:

  (1)strPattern = "(((\s|\D|\W)(\d{5})(\s|\D|\W))|((\d{5})(\s|\D|\W))|((\s|\D|\W)(\d{5})))"
  (2)strPattern = "\d{5}"
  (3)strPattern = "(\s|\D|\W)(\d{5})(\s|\D|\W)"
  (4)strPattern = "\D(\d{5})\D"

(3)无法与ExampleB一起使用

(2)无法与ExampleA一起使用

(1)是我能得到的最好的结果,但在少数几个单元格中都无法工作。

什么是我的正则表达式代码的好模式?

3 个答案:

答案 0 :(得分:3)

您可以使用

(?:^|\D)(\d{5})(?!\d)

请参见regex demo

(?:^|\D)将匹配字符串的开头或除数字以外的任何字符,(\d{5})将捕获5位数字到组1中,而(?!\d)将确保下一个字符不匹配一个数字。

示例代码:

Dim re, targetString, colMatch, objMatch
Set re = New regexp
With re
 .pattern = "(?:^|\D)(\d{5})(?!\d)"
 .Global = True              ' Same as /g at the online tester
End With
targetString = "123456789 dsadss12345@3_- 1d22d333"
Set colMatch = re.Execute(targetString)
For Each objMatch In colMatch
  Debug.Print objMatch.SubMatches.Item(0)
Next

答案 1 :(得分:2)

RegEx备忘单

这并不是一个真正的答案,但我认为这份出色的总结值得(并且可以在此处轻松共享!)

点击图片可查看大图。

答案 2 :(得分:1)

这通过了OP中概述的所有测试:

((?<!\d)\d{5}(?!\d))

完全匹配将是连续的5位数字,除了数字外,其他任何数字都将其包围

正在验证:

https://regex101.com/r/Oz2aeR/1