2016-03-08 5 views
1

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

Это RegEx, который я построил, чтобы получить то, что я хочу.

\S*\d*?-[A-Z]*[0-9]* 

Я только хочу, чтобы прописные буквы и цифры с тире, так это получить GC-113, AO-1-GC-113, AO-2-GC-113, что это здорово!

«Я не хочу этого ------, но это хорошо GC-113, AO-1-GC-113, AO-2-GC-113»

НО, если я приду через один, где нет пространства между числом, а просто еще один символ как запятая или период, то он возвращает матч на весь раздел «GC-113,AO-1-GC-113,AO-2-GC-113»

«Я не хочу этого ------, но это хорошо GC-113,AO-1-GC-113,AO-2-GC-113»

Я использую RegexBuddy, чтобы попытаться понять это.

Это код VBA, который я использую, чтобы получить совпадения.

Public Function GetRIs(ByVal vstrInString As String) As Collection 
Dim myRegExp As RegExp 
Dim myMatches As Variant 
Dim myMatch As Variant 

Set GetRIs = New Collection 
Set myRegExp = New RegExp 

myRegExp.Global = True 
myRegExp.Pattern = "\S*\d*?-[A-Z]*[0-9]*" 
Set myMatches = myRegExp.Execute(vstrInString) 

For Each myMatch In myMatches 
    If myMatch.Value <> "" Then 
     GetRIs.Add myMatch.Value 
    End If 
Next 

End Function 

Thanks! Dave

+0

Я чувствую, вы ищете [ '\ W + (?: - \ ш +) *'] (HTTPS : //regex101.com/r/hK4tZ2/1) –

+0

@DaveStuart - отредактируйте исходное сообщение с кодом VBA. Также я отформатировал ваш вопрос. Если что-то отформатировано неправильно («Я не хочу этого [...]»), пожалуйста, отформатируйте его правильно. –

+0

Wiktor, этот получает ВСЕ текст. Я ищу более конкретное регулярное выражение, чтобы вытащить эти 3 комбинации из GC-113, AO-1-GC-113, AO-2-GC-113. –

ответ

1

Ваш \S*\d*?-[A-Z]*[0-9]* модель может даже соответствовать один дефис, как только - является обязательным, а остальные подмасках могут соответствовать ноль раз (может отсутствовать в строке).

Вы можете использовать

myRegExp.Pattern = "\b[A-Z0-9]+(?:-[A-Z0-9]+)+" 

pattern matches:

  • \b - границы слова (до следующей буквы или цифры должны быть без текстового символа или начало строки
  • [A-Z0-9]+ - одна или несколько букв или цифр
  • (?:-[A-Z0-9]+)+ - 1 или более последовательностей:
    • - - дефис
    • [A-Z0-9]+ - один или несколько букв или цифр
+1

Спасибо Wiktor! Это прекрасно работает, а также благодарит вас за то, что вы так хорошо объясняете все. –

Смежные вопросы