2017-02-07 4 views
4

У меня есть пользовательский ввод, который я хочу проверить на правильность. Пользователь должен ввести 1 или более наборов символов, разделенных запятыми.Excel VBA Regex Check for Repeated Strings

Таким образом, они действительны вход

  • COM1
  • COM1, COM2,1234

они являются недействительными

  • COM - только 3 символов
  • COM1, 123 - один набор - всего 3 символа
  • COM1.1234, ABCD - точка разделитель не запятая

Я гугл для шаблона регулярного выражения к этому и нашел возможный образец, который проверяется на повторяющийся экземпляр любых 3-х символов, и я модифицирована так, как

/^(.{4,}).*\1$/

, но это не находит соответствия.

Я могу управлять последней запятой, которая может быть или не быть там, прежде чем перейти к тесту, чтобы она всегда была там.

Желательно, чтобы я тестировал буквы (в любом случае) и только цифры, но я могу жить с любыми символами.

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

ТИА

ответ

3

Я считаю, что это делает то, что вы хотите:

^([A-Z|a-z|0-9]{4},)*[A-Z|a-z|0-9]{4}$ 

Это строка, начинающаяся за которым следуют ноль или более групп из четырех букв или цифр, заканчивающихся с запятой, а затем одна группа из четырех человек буквы или цифры, за которыми следует конец строки.

Вы можете играть с ним здесь: https://regex101.com/r/Hdv65h/1

+0

Nice Doug. Ссылка на предварительно заполненный ответ тоже очень полезна. – brettdj

+0

Спасибо, Брет. Да, это полезный сайт. Между этим и notepad ++ я обычно могу заставить регулярное выражение работать. –

2

Регулярное выражение

"^[\w]{4}(,[\w]{4})*$" 

должен работать.

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

Sub findPattern() 
    Dim regEx As New RegExp 
    regEx.Global = True 
    regEx.IgnoreCase = True 
    regEx.Pattern = "^[\w]{4}(,[\w]{4})*$" 
    Dim i As Integer 
    Dim val As String 
    For i = 1 To 5: 
    val = Trim(Cells(i, 1).Value) 
    Set mat = regEx.Execute(val) 
    If mat.Count = 0 Then 
     MsgBox ("No match found for " & val) 
    Else 
     MsgBox ("Match found for " & val) 
    End If 
Next 
End Sub