2013-11-17 2 views
1

Я пытаюсь использовать Regex в VBA, чтобы соответствовать целому слову, содержащему дефис и цифры. Я знаю, что \b не будет работать, потому что он только устанавливает границы алфавита.Регулярное выражение для целого слова, содержащего специальные символы в VBA

Это можно сделать в Regex в VBA?

rx.Pattern = "[a-z][a-z][0-9]-[0-9][0-9]" 

EDIT: Извините, если я не был достаточно ясен. Мой шаблон имеет следующий формат «AA2-11». Я хочу совместить эту целую строку, поэтому я не могу использовать rx.pattern = "[az] [az] [0-9] - [0-9] [0-9]", потому что это приведет к совпадению если у вас есть, например, «AA2-11-4», а я просто хочу «AA2-11»

+1

[Как использовать регулярные выражения в Visual Basic] (http://www.regular-expressions.info/vb.html) –

+0

Будет ли дефис прийти сначала или номер? –

+1

Можете ли вы включить некоторые слова в свой вопрос? –

ответ

3

Это то, что вы хотите?

БОЛЬШЕ Followup

Спасибо за обновление своего ответа, но я боюсь, что он не работает. Скажем, у моего документа есть, например, AA12-12, AB14-26. Первое появление не соответствует.

Sub Sample() 
    Dim regString As String 
    Dim myRegExp As RegExp 

    regString = "AA12-12#AB14-26"      '<~~ Matches 
    'regString = "#AA12-12,AB14-26#"     '<~~ Matches 
    'regString = "AA2-11 is a sample string"   '<~~ Matches 

    'regString = "This is a sample AA2-11-11"   '<~~ Doesn't Match 
    'regString = "This is a sample AA2-11-11 string" '<~~ Doesn't Match 
    'regString = "This is a sample AA2-11-11 string" '<~~ Doesn't Match 

    regString = " " & regString & " " 

    Set myRegExp = New RegExp 

    With myRegExp 
     .Global = True 
     .Pattern = "\b[a-zA-Z]{2}\d{1,}-\d{2,}\b(?=[^-])" 
     If myRegExp.Test(regString) Then 
      Debug.Print "Found" 
     Else 
      Debug.Print "Not Found" 
     End If 
    End With 
End Sub 

Или как это

Sub Sample() 
    Dim regString As String 
    Dim myRegExp As RegExp 
    Dim myMatches As MatchCollection 
    Dim myMatch As Match 

    regString = "AA12-12,AB14-26"    '<~~ Matches 
    'regString = "#AA12-12,AB14-26#"  '<~~ Matches 
    'regString = "AA2-11 is a sample string"   '<~~ Matches 

    'regString = "This is a sample AA2-11-11"   '<~~ Doesn't Match 
    'regString = "This is a sample AA2-11-11 string" '<~~ Doesn't Match 
    'regString = "This is a sample AA2-11-11 string" '<~~ Doesn't Match 

    regString = " " & regString & " " 

    Set myRegExp = New RegExp 

    With myRegExp 
     .Global = True 
     .Pattern = "\b[a-zA-Z]{2}\d{1,}-\d{2,}\b(?=[^-])" 

     Set myMatches = myRegExp.Execute(regString) 

     For Each myMatch In myMatches 
      Debug.Print myMatch.Value 
     Next 
    End With 
End Sub 
+0

Вторая покупка - это то, что я искал. Большое спасибо! – Jeanno

+0

Оба одинаковы. Единственное различие заключается в '.IgnoreCase = True' :) –

+0

Хм, я только заметил, что шаблон, который вы предложили, не будет работать, если у вас длинная строка. См. В моем случае. Я назначаю regString для содержимого документа Word, regString = ActiveDocument.Range.Txt, я подозреваю, потому что в этом случае каретка и сигила не будут работать. – Jeanno

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