как вытащить ровно 6 сплошных фигур из струны - PullRequest
0 голосов
/ 15 ноября 2018

Проблема: как вытащить точно 6 непрерывных цифр из строки

Пример:

f657674
576767g
tt454656y
465767yy
x1234567
1234567x
n645856g
s-5656-54654657657-6576-46567785-4354
pof-user-201734545435454
4545665
345678
f546576767g
rtryty

это должно дать

657674
576767
454656
465767
(blank value)
(blank value)
645856
(blank value)
(blank value)
(blank value)
345678
(blank value)
(blank value)

ЧтоЯ пробовал: (A1 - это ячейка первой строки)

=IFERROR(LOOKUP(10^6;MID(A1;ROW(INDIRECT("1:"&LEN(A1)-5));6)+0);"")

Затем я перетаскиваю эту формулу для других строк, и она дает:

    657674    (right)
    576767    (right)
    454656    (right)
    465767    (right)
   (blank value)  (right) 
   (blank value)  (right)
    645856    (right)
    657457    (wrong)
    435454    (wrong)
    4545665   (wrong)  
    345678    (right)
    546576767 (wrong)
    (blank value)  (right)

Версия:Excel 2016

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Вдохновлен Брюсом, но спарен до минимума

Function ContainsSix(ByVal rng As Range) As String
    Dim re As RegExp
    Dim mc As MatchCollection
    Dim CellValue As Variant

    CellValue = rng.Cells(1, 1).Value2
    Set re = New RegExp
    With re
        .Pattern = "(?:\D|^)(\d{6})(?:\D|$)"
        .Global = True
        .MultiLine = True
        .IgnoreCase = True

        If .Test(CellValue) Then
            Set mc = .Execute(CellValue)
            ContainsSix = mc(0).SubMatches(0)
        End If
    End With
    Set re = Nothing
End Function

Описание регулярного выражения:

  • Совпадение выражения, но не захватывать его. [\ D | ^]
    • Выберите из 2 альтернатив
      • Любой символ, который не является цифрой
      • Начало строки или строки
  • Нумерованная группа захвата. [\ D {6}]
    • Любая цифра, ровно 6 повторений
  • Совпадение выражения, но не захватывать его. [\ D | $]
    • Выберите из 2 альтернатив
      • Любой символ, который не является цифрой
      • Конец строки или строки
0 голосов
/ 16 ноября 2018

=IFERROR(0+MID(A1,MATCH(8,MMULT(ABS(ISNUMBER(0+MID(MID("ζ"&A1&"ζ",ROW(INDEX(A:A,1):INDEX(A:A,LEN(A1)-5)),8),{1,2,3,4,5,6,7,8},1))-{1,0,0,0,0,0,0,1}),{1;1;1;1;1;1;1;1}),0),6),"")

Обратите внимание, что если вы не используете англоязычную версию Excel, возможно, потребуется изменить некоторые из перечисленных выше частей.

С уважением

0 голосов
/ 15 ноября 2018

Скорее всего, вам понадобится UDF вместо встроенной функции.Это должно работать, но, вероятно, нуждается в настройке.Ваш пример в вашем OP возвращает 345678 как правильное возвращение, но с обеих сторон нет букв.Поэтому я предполагаю, что вы хотите: либо 6 последовательных чисел сами по себе , либо 6 последовательных чисел с буквой на обеих сторонах.

Добавьте это в модуль рабочей книги, и вы сможете звонить как=return_numbers(A1).Вы можете или не можете добавить ссылку RegEx в VBEditor.

Function return_numbers(ByVal cel As Range) As String
Dim strPattern As String
Dim regEx As New RegExp

strPattern = "[a-z]\d{6}[a-z]"

With regEx
    .Global = True
    .MultiLine = True
    .IgnoreCase = True
    .Pattern = strPattern
End With

Dim matches As Object
Set matches = regEx.Execute(cel)

If Len(cel) = 6 And IsNumeric(cel) Then
    return_numbers = cel.Value
    Set regEx = Nothing
    Exit Function
End If

If matches.Count <> 0 Then
    return_numbers = Mid(matches.Item(0), 2, Len(matches.Item(0)) - 2)
ElseIf matches.Count = 0 Then
    strPattern = "[a-z]{1}\d{6}$"
    regEx.Pattern = strPattern
    Set matches = regEx.Execute(cel)
    If matches.Count <> 0 Then
        return_numbers = Mid(matches.Item(0), 2, Len(matches.Item(0)) - 1)
    ElseIf matches.Count = 0 Then
        strPattern = "^\d{6}[a-z]{1}"
        regEx.Pattern = strPattern
        Set matches = regEx.Execute(cel)
        If matches.Count <> 0 Then
            return_numbers = Mid(matches.Item(0), 1, Len(matches.Item(0)) - 1)
        End If
    End If
End If

Set regEx = Nothing

End Function

enter image description here

Если вы 'желая ускорить это, я думаю, что если вы переключите операторы If/else, он может работать немного быстрее, поскольку он не будет всегда запускать регулярное выражение, если он найдет 6 одиночных цифр

Редактировать: Это довольно неуклюже.Я уверен, что есть лучший шаблон регулярных выражений, поэтому, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...