Я пытаюсь создать регулярное выражение, чтобы извлечь 7-значное число из строки, но с трудностями получить шаблон правильно.Regex return number match only
Пример строки - 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
Я пробовал все 3 модели в этом коде, но Я получаю возврат O1519641, O1528113T, O1530212
при использовании "\D(\d{7})\D"
. Как я понимаю, ()
ничего не значит из-за того, как я сохраняю совпадения, в то время как я изначально думал, что они означают, что выражение будет вернуть, что было внутри ()
.
Я тестировал вещи на http://regexr.com/, но я до сих пор не знаю, как это сделать, чтобы номер был внутри строки, так как WO1528113TB
является только возвращаемым числом. Мне нужно запустить RegEx по возвращенному значению RegEx, чтобы исключить буквы во второй раз?
Вам нужен ваш ожидаемый результат - это всего лишь одна строка или массив/коллекция? –
Я могу работать с одним, но в идеале мне нужно вернуть наибольшее количество из коллекции. – tjb1
Ну, попробуйте 'strPattern =" (?:^| \ D) (\ d {7}) (?! \ D) ", а затем' s = s & "Word:" & match.SubMatches (0) & "". Дело в том, что вам нужно перебирать все подмассивы с помощью 'match.SubMatches (0)', а затем вы можете проверить, какая из них самая большая. –