2016-11-30 2 views
1

Я пытаюсь создать регулярное выражение, чтобы извлечь 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, чтобы исключить буквы во второй раз?

+0

Вам нужен ваш ожидаемый результат - это всего лишь одна строка или массив/коллекция? –

+0

Я могу работать с одним, но в идеале мне нужно вернуть наибольшее количество из коллекции. – tjb1

+0

Ну, попробуйте 'strPattern =" (?:^| \ D) (\ d {7}) (?! \ D) ", а затем' s = s & "Word:" & match.SubMatches (0) & "". Дело в том, что вам нужно перебирать все подмассивы с помощью 'match.SubMatches (0)', а затем вы можете проверить, какая из них самая большая. –

ответ

3

я предлагаю использовать следующую схему:

strPattern = "(?:^|\D)(\d{7})(?!\d)" 

Тогда вы сможете получить доступ к захватывая группа 1 содержимое (т.е. текст захватил с (\d{7}) части регулярного выражения) через match.SubMatches(0), а затем может проверить, какое значение является наибольшим. Подробнее

Pattern:

  • (?:^|\D) - не-захвата группы (не создает submatch) соответствие начало строки (^) или нецифры (\D)
  • (\d{7}) - Захват группы 1 соответствует 7 цифрам
  • (?!\d) - отрицательный результат, не соответствующий совпадению, если есть цифра сразу после 7 цифр.
+0

Хорошее объяснение. –